コガネブログ

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

【Unity】Addressables でリモートカタログのダウンロード時にディスクの空き容量が不足していないか確認する例

ソースコード

using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;

public class Example : MonoBehaviour
{
    // リモートカタログのダウンロード時にディスクの空き容量が不足している場合
    // 以下のようなエラーや例外が発生するのでそれで確認できる
    // Disk full.
    private static readonly string[] ERROR_MESSAGES =
    {
        "Disk full.",
    };

    // ゲーム開始時に呼び出されます
    private async void Start()
    {
        // Addressables を初期化します
        await Addressables.InitializeAsync().Task;

        // カタログを更新します
        await UpdateCatalogs();
    }

    // カタログを更新します
    private static async Task UpdateCatalogs()
    {
        var isDiskFull = false;

        // Addressables 内部でエラーや例外が発生した時に呼び出されます
        void OnLogMessageReceivedThreaded( string condition, string trace, LogType type )
        {
            // 既にエラーを検知している場合は無視します
            if ( isDiskFull ) return;

            // 通常のログと警告ログは無視します
            if ( type == LogType.Log || type == LogType.Warning ) return;

            // ディスクの空き容量が不足している系のメッセージならエラーとみなします
            isDiskFull = ERROR_MESSAGES.Any( x => condition.Contains( x ) );

            // Addressables 内部でエラーや例外が発生した時に呼び出される関数を解除します
            Application.logMessageReceivedThreaded -= OnLogMessageReceivedThreaded;
        }

        // Addressables 内部でエラーや例外が発生した時に呼び出される関数を登録します
        Application.logMessageReceivedThreaded += OnLogMessageReceivedThreaded;

        // カタログを更新します
        var result = Addressables.UpdateCatalogs();

        // 更新が完了するのを待機します
        await result.Task;

        // Addressables 内部でエラーや例外が発生した時に呼び出される関数を解除します
        Application.logMessageReceivedThreaded -= OnLogMessageReceivedThreaded;

        if ( isDiskFull )
        {
            Debug.LogError( "ディスクの空き容量が不足している" );
            return;
        }

        Debug.Log( "成功" );
    }
}