【Unity】【Addressable】DiagnosticCallbackで参照カウントなどを取得する

AddressableアセットシステムのDiagnosticCallbackで参照カウントやAsyncOperationのイベントを取得する方法です。

Unity2020.1.10
Addressables 1.16.15

やりたいこと

いま、Addressableでロードしたアセットの参照カウントがいくつなのかを取得することを考えます。
参照カウントを見るツールとしてEventViewerがあります。

light11.hatenadiary.com

が、今回はこれを使わずコードベースでDiagnosticCallbackを使うことで参照カウントを取得します。

準備

DiagnosticCallbackを使うにはまずAddressable Asset SettingsのSend Profiler Eventにチェックをしておく必要があります。

f:id:halya_11:20210207160806p:plain
Send Profiler Events

また準備の二点目として、Play Mode ScriptをSimulate GroupsかUse Exisiting Buildにしておきます。

f:id:halya_11:20210207160957p:plain
PlayMode

Use Existing Buildにした場合にはAddressablesのビルドも必要です。

参照カウントを取得する

さてそれではDiagnosticCallbackを使って参照カウントを取得します。

using System;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement;

public class Example : MonoBehaviour
{
    private async void Start()
    {
        // DiagnosticCallbackを登録
        Addressables.ResourceManager.RegisterDiagnosticCallback(DiagnosticCallback);

        // アセットを読み込む
        var handle = Addressables.LoadAssetAsync<GameObject>("FooPrefab");
        await handle.Task;
        Addressables.Release(handle);

        // DiagnosticCallbackを登録解除
        Addressables.ResourceManager.UnregisterDiagnosticCallback(DiagnosticCallback);
    }

    private void DiagnosticCallback(ResourceManager.DiagnosticEventContext context)
    {
        // 参照カウントの変更通知だけログ出力する
        if (context.Type == ResourceManager.DiagnosticEventType.AsyncOperationReferenceCount)
        {
            Debug.Log(
                "Reference count changed" +
                $"{Environment.NewLine}Location: {context.Location}" +
                $"{Environment.NewLine}Reference count: {context.EventValue}");
        }
    }
}

上記を実行すると参照カウント変更時にその内容がログ出力されることが確認できます。

取得できるイベントの種類

DiagnosticCallbackを使うと参照カウント以外の情報も取得できます。
取得できるイベントは以下の通りです。

  • AsyncOperationが失敗
  • AsyncOperation作成
  • AsyncOperationの進捗
  • AsyncOperationの完了
  • AsyncOperationの参照カウント
  • AsyncOperationの破棄

関連

light11.hatenadiary.com