コガネブログ

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

【Unity】Addressables でリモートカタログを更新する時にメインスレッドが止まらないようにする方法

検証環境

  • Addressables 1.16.19

概要

  • Addressables で管理しているグループが多いと、
    Addressables.UpdateCatalogs の処理に時間がかかるようになり、
    メインスレッドが止まってしまう
  • 重たい処理は UpdateCatalogsOperation.Execute 関数なので
    この部分を Tesk.Run で別スレッドに処理を逃してあげることで
    メインスレッドが止まることは防げる

UpdateCatalogsOperation.cs

52 行目以降

protected override async void Execute()
{
    var result = await System.Threading.Tasks.Task.Run
    (
        () =>
        {
            var catalogs = new List<IResourceLocator>(m_DepOp.Result.Count);
            for (int i = 0; i < m_DepOp.Result.Count; i++)
            {
                var               locator        = m_DepOp.Result[i].Result as IResourceLocator;
                string            localHash      = null;
                IResourceLocation remoteLocation = null;
                if (locator == null)
                {
                    var catData = m_DepOp.Result[i].Result as ContentCatalogData;
                    locator        = catData.CreateCustomLocator(catData.location.PrimaryKey);
                    localHash      = catData.localHash;
                    remoteLocation = catData.location;
                }

                m_LocatorInfos[i].UpdateContent(locator, localHash, remoteLocation);
                catalogs.Add(m_LocatorInfos[i].Locator);
            }

            return catalogs;
        }
    );
    Complete(result, true, null);
}