タイトルにある通り、ScriptableObjectのScript名を記憶しておくEditor拡張
・背景
プロジェクトをパッケージで複数人とやり取りするシチュエーションでScriptableObjectとデータコンテナの関係性が分からなくなってしまう場合があったからです。
ScriptableObjectに以下のようなメソッドを追加
[CreateAssetMenu(fileName = "ScriptableObjectContainer", menuName = "Custom/ScriptableObject Container")]
public class ScriptableObjectContainer : ScriptableObject
{
[SerializeField]
private string scriptName;
public void SetScriptName(string name)
{
scriptName = name;
}
public string GetScriptName()
{
return scriptName;
}
}
このスクリプトでは、ScriptableObjectの追加と削除を管理します。
次に、ScriptableObject を管理するスクリプトを作成します。このスクリプトでは、ScriptableObject を管理するためのリストを作成し、追加や削除時に適切なログを表示します。
using UnityEditor;
ublic class ScriptableObjectManager : MonoBehaviour
{
public List<ScriptableObjectContainer> scriptableObjects = new List<ScriptableObjectContainer>();
private void OnEnable()
{
EditorApplication.projectChanged += CheckDeletedScriptableObjects;
}
private void OnDisable()
{
EditorApplication.projectChanged -= CheckDeletedScriptableObjects;
}
private void CheckDeletedScriptableObjects()
{
List<ScriptableObjectContainer> deletedScriptableObjects = new List<ScriptableObjectContainer>();
foreach (ScriptableObjectContainer obj in scriptableObjects)
{
if (obj == null)
{
deletedScriptableObjects.Add(obj);
}
}
foreach (ScriptableObjectContainer deletedObject in deletedScriptableObjects)
{
scriptableObjects.Remove(deletedObject);
string scriptName = deletedObject.GetScriptName();
Debug.Log($"{scriptName} が削除されました。");
}
}
}
最後に、ScriptableObject のスクリプト名を記憶しておくためのエディタ拡張を作成します。このエディタ拡張は、ScriptableObject が追加されるたびにスクリプト名を記憶します。
using UnityEditor;
[CustomEditor(typeof(ScriptableObjectContainer))]
public class ScriptableObjectContainerEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
ScriptableObjectContainer container = (ScriptableObjectContainer)target;
string scriptName = target.GetType().ToString();
container.SetScriptName(scriptName);
}
}
作成手順
ScriptableObjectを管理するスクリプト(ScriptableObjectManager)をゲームオブジェクトにタッチします。その後、ScriptableObjectContainerのエディタ拡張(ScriptableObjectContainerEditor)を使用して、ScriptableObjectを作成します。ScriptableObjectが削除されると、コンソールに削除されたスクリプト名が表示されます。
注意
エディタ拡張はエディタ内でのみ動作し、実行時には無視されます。また、エディタ拡張を使うためには、エディタ スクリプトをフォルダ内に構成する必要があります