こんにちは。カヤックアキバスタジオでエンジニアをやっている瀬尾です。
この記事は 面白法人グループ Advent Calendar 2022 の10日目の記事です。
今回はUnityのAssetGraphToolを使った時のお話です。
つまずいた箇所
List形式のデータを追加し、シリアライズしたListをインスペクターに追加することは簡単でしたが、
再起動した際に状態が保存されませんでした。
調査したところ、
SerializedInstanceというクラスが用意されているようです。
動作するようにしたサンプル
using UnityEditor;
using System;
namespace UnityEngine.AssetGraph
{
public interface ISample
{
void OnInspectorGUI(Rect rect, Action onValueChanged);
}
[System.Serializable]
public class SampleInstance : SerializedInstance
{
public SampleInstance() : base() { }
public SampleInstance(SampleInstance instance) : base(instance) { }
public SampleInstance(ISample obj) : base(obj) { }
}
[Serializable]
public class SampleData
{
[SerializeField] private SampleInstance m_instance;
public SampleData(ISample sample)
{
m_instance = new SampleInstance(sample);
}
public SampleData(SampleData e)
{
m_instance = new SampleInstance(e.m_instance);
}
public SampleInstance Instance
{
get
{
return m_instance;
}
set
{
m_instance = value;
}
}
public string Hash
{
get
{
return m_instance.Data;
}
}
}
}
ノードで実際に使用するクラス定義
namespace UnityEngine.AssetGraph
{
public class Sample : ISample
{
[SerializeField] private string m_keyword;
[SerializeField] private string m_parameterKey;
public Sample()
{
m_keyword = "";
m_parameterKey = "";
}
public Sample(string name)
{
m_keyword = name;
}
public void OnInspectorGUI(Rect rect, Action onValueChanged)
{
var keyword = m_keyword;
var parameter = m_parameterKey;
GUIStyle s = new GUIStyle((GUIStyle)"TextFieldDropDownText");
Rect filerKeywordRect = rect;
Rect parameterRect = rect;
filerKeywordRect.width = 120f;
parameterRect.x += 124f;
parameterRect.width = 124f;
keyword = EditorGUI.TextField(filerKeywordRect, m_keyword, s);
parameter = EditorGUI.TextField(parameterRect, m_parameterKey, s);
if (keyword != m_keyword)
{
m_keyword = keyword;
onValueChanged();
}
if (parameter != m_parameterKey)
{
m_parameterKey = parameter;
onValueChanged();
}
}
}
}
あとは表示するノード側のOnInspectorGUIで、表示処理を呼び出すことで表示されます。
また、状態の保存も問題無く実行されました。

まとめ
かなり簡単に実装することができました。
Editorはそれほど手を出していなかったので
これからもうすこし拡張機能に挑戦してみようと思います。