コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Addressables でストレージの空き容量が不足している時にリモートカタログをダウンロードしても正常に動作するように

検証環境

  • Addressables 1.16.19

概要

  • Addressables ではサーバからダウンロードしたリモートカタログを
    端末のキャッシュに保存する際に、ストレージの空き容量を確認していない
  • そのため、空き容量が不足していると File.WriteAllText で例外が発生して
    ContentCatalogProvider で ProvideHandle.Complete が呼ばれなくなるので
    Addressables の処理が完了していないことになり
    それ以降 Addressables の API を呼び出しても処理が進行しなくなる現象に遭遇した
  • ContentCatalogProvider で File.WriteAllText でリモートカタログを
    キャッシュに保存する際に例外が発生したかどうかのチェックを追加して
    例外が発生した場合も ProvideHandle.Complete を呼ぶようにすれば
    キャッシュの保存に失敗した後も Addressable の API は正常に呼び出せるようになる

ContentCatalogProvider.cs

272 行目以降

private void OnCatalogLoaded(ContentCatalogData ccd)
{
    Addressables.LogFormat("Addressables - Content catalog load result = {0}.", ccd);
    if (ccd != null)
    {
        ccd.location = m_ProviderInterface.Location;
        ccd.localHash = m_LocalHashValue;
        if (!string.IsNullOrEmpty(m_RemoteHashValue) && !string.IsNullOrEmpty(m_LocalDataPath))
        {
            var dir = Path.GetDirectoryName(m_LocalDataPath);
            if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
                Directory.CreateDirectory(dir);
            var localCachePath = m_LocalDataPath;
            Addressables.LogFormat("Addressables - Saving cached content catalog to {0}.", localCachePath);
            try
            {
                File.WriteAllText(localCachePath, JsonUtility.ToJson(ccd));
                File.WriteAllText(localCachePath.Replace(".json", ".hash"), m_RemoteHashValue);
            }
            catch ( Exception e )
            {
                m_ProviderInterface.Complete(ccd, false, e);
                ccd.localHash = m_RemoteHashValue;
                return;
            }
            ccd.localHash = m_RemoteHashValue;
        }
    }
    m_ProviderInterface.Complete(ccd, ccd != null, ccd == null ? new Exception($"Unable to load ContentCatalogData  from location {m_ProviderInterface.Location}.") : null);
}