🌟

[Unity]Addressableへの登録状態でProjectビュー表示を色分けする

2022/12/25に公開

【まんてらスタジオ】みんなの闇鍋 Advent Calendar 2022の最終日です。

はじめに

Addressableに登録済みのアセットはInspectorビューのAddressable欄とAddressable Groupウィンドウで確認できますが、Inspectorビューの方は分かりづらく見落としで登録漏れになりがちです。
Addressable Groupの設定によってもロードがリモートかローカル、ビルドに含むかなど設定によって変わりますがSchemaのInspectorを確認する必要があり分かりづらいです。

これらを改善するためにAddressable Groupに登録済みのアセットをGroupのロード・ビルドに含むかの設定毎にProjectビューに色付けするエディタ拡張を作ってみました。

実装についての説明

AddressableProjectView.cs
    static AddressableProjectView()
    {
        EditorApplication.projectWindowItemOnGUI += OnGUIProjectView;
        _colorSetting = LoadColorSetting();
    }

Projectビューへの描画についてはprojectWindowItemOnGUIのコールバックを使って行いました。

AddressableProjectView.cs
    private static void OnGUIProjectView(string guid, Rect rect)
    {
        var assetEntry = AddressableAssetSettingsDefaultObject.Settings.FindAssetEntry(guid, true);
        if (assetEntry == null)
        {
            return;
        }
        
        var groupSchema = assetEntry.parentGroup.GetSchema<BundledAssetGroupSchema>();
        if (groupSchema == null)
        {
            return;
        }
        
        EditorGUI.DrawRect(rect, GetDrawColor(groupSchema));
    }

projectWindowItemOnGUIの引数にはアセットのguidあるので、
こちらを使いAddressableのAssetEntry(アセットの登録情報の様なもの)を取得します。

AssetEntryから登録されているGroupを引っ張ってきてSchemaを取得して来て表示色の判定メソッドに渡します。

AddressableProjectView.cs
    private static Color GetDrawColor(BundledAssetGroupSchema groupSchema)
    {
        if (_colorSetting == null || AddressableAssetSettingsDefaultObject.Settings == null)
        {
            return Color.clear;
        }
        
        Color color;

        var pathName = groupSchema.LoadPath.GetName(AddressableAssetSettingsDefaultObject.Settings);
        if (!groupSchema.IncludeInBuild)
        {
            color = _colorSetting.ExcludeBuildColor;
        }
        else if( pathName == AddressableAssetSettings.kRemoteLoadPath)
        {
            color = _colorSetting.RemoteLoadColor;
        }
        else if (pathName == AddressableAssetSettings.kLocalLoadPath)
        {
            color = _colorSetting.LocalLoadColor;
        }
        else
        {
            color = _colorSetting.OtherRegisteredColor;
        }

        // projectWindowItemOnGUIのタイミングの関係上アイコン・ラベルの上に描画する為、透過する
        color.a *= 0.3f;
        return color;
    }

SchemaのIncludeInBuildを使ってビルドに含むのかの判定
LoadPathのパス名を取得してRemoteロードかLocalロードの判定をします。

※projectWindowItemOnGUIはアイコンとラベルの描画の呼ばれるので色を半透明にしてます。

コード全体

AddressableProjectView.cs
using UnityEditor;
using UnityEngine;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;

[InitializeOnLoad]
public static class AddressableProjectView
{
    private static ColorSetting _colorSetting;
    
    static AddressableProjectView()
    {
        EditorApplication.projectWindowItemOnGUI += OnGUIProjectView;
        _colorSetting = LoadColorSetting();
    }

    internal static ColorSetting LoadColorSetting()
    {
        var guids = AssetDatabase.FindAssets ("t:ColorSetting");
        if (guids.Length == 0)
        {
            Debug.LogError("[AddressableProjectView]ColorSetting does not found.");
            return null;
        }

        var path = AssetDatabase.GUIDToAssetPath(guids[0]);
        return AssetDatabase.LoadAssetAtPath<ColorSetting>(path);
    }

    private static void OnGUIProjectView(string guid, Rect rect)
    {
        var assetEntry = AddressableAssetSettingsDefaultObject.Settings.FindAssetEntry(guid, true);
        if (assetEntry == null)
        {
            return;
        }
        
        var groupSchema = assetEntry.parentGroup.GetSchema<BundledAssetGroupSchema>();
        if (groupSchema == null)
        {
            return;
        }
        
        EditorGUI.DrawRect(rect, GetDrawColor(groupSchema));
    }

    private static Color GetDrawColor(BundledAssetGroupSchema groupSchema)
    {
        if (_colorSetting == null || AddressableAssetSettingsDefaultObject.Settings == null)
        {
            return Color.clear;
        }
        
        Color color;

        var pathName = groupSchema.LoadPath.GetName(AddressableAssetSettingsDefaultObject.Settings);
        if (!groupSchema.IncludeInBuild)
        {
            color = _colorSetting.ExcludeBuildColor;
        }
        else if( pathName == AddressableAssetSettings.kRemoteLoadPath)
        {
            color = _colorSetting.RemoteLoadColor;
        }
        else if (pathName == AddressableAssetSettings.kLocalLoadPath)
        {
            color = _colorSetting.LocalLoadColor;
        }
        else
        {
            color = _colorSetting.OtherRegisteredColor;
        }

        // projectWindowItemOnGUIのタイミングの関係上アイコン・ラベルの上に描画する為、透過する
        color.a *= 0.3f;
        return color;
    }
}

リポジトリ

https://github.com/Itoen/AddressableProjectView

参考ページ

https://baba-s.hatenablog.com/entry/2015/06/22/090000

Discussion