🌟
[Unity]Addressableへの登録状態でProjectビュー表示を色分けする
【まんてらスタジオ】みんなの闇鍋 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;
}
}
リポジトリ
参考ページ
Discussion