コガネブログ

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

【Unity】Addressables でカタログの JSON を読み込む時にメインスレッドが止まらないようにする方法

検証環境

  • Addressables 1.16.19

概要

  • Addressables で管理しているグループが多いと、
    カタログの JSON のサイズが大きくなり、
    カタログの読み込みに時間がかかるようになり、メインスレッドが止まってしまう
  • カタログは JSONAssetProvider クラスで JsonUtility.FromJson で読み込まれるので
    この部分を Tesk.Run で別スレッドに処理を逃してあげることで
    カタログ読み込み時に時間がかかってもメインスレッドが止まることは防げる

JsonAssetProvider

19 行目以降

public override async Task<object> Convert(Type type, string text)
{
    try
    {
        return await Task.Run( () => JsonUtility.FromJson(text, type) );
    }
    catch (Exception e)
    {
        if (!IgnoreFailures)
            Debug.LogException(e);

        return null;
    }
}

TextDataProvider

34 行目

public async void Start(ProvideHandle provideHandle, TextDataProvider rawProvider, bool ignoreFailures)

48 行目

object result = await m_Provider.Convert(m_PI.Type, text);

84 行目

private async void RequestOperation_completed(AsyncOperation op)

93 行目

result = await m_Provider.Convert(m_PI.Type, webReq.downloadHandler.text);

112 行目

public virtual async Task<object> Convert(Type type, string text) { return await Task.FromResult( text ); }