Unityのインスペクターでキーと値のペアを取得する簡単な方法の1つは、シリアライズ可能なエントリクラスを定義し、それらの配列またはList <>を使用することです。例えば...
public class SpellAnimationMap : ScriptableObject
{
[System.Serializable]
public class SpellAnimationEntry
{
public Spell spell;
public AnimationClip animation;
}
public SpellAnimationEntry[] spellAnimations;
}
これにより、カスタムインスペクターを記述する必要なく、キーと値を入力できるサイズ変更可能なリストがインスペクターに表示されます。
結果は次のようになります。
(1つの秘::直列化されたエントリクラスに「名前」フィールドが含まれている場合、「文字列0」という見出しの代わりにその文字列が表示されます。より複雑なデータを効率的にナビゲートしたい場合に便利です。)
これをScriptableObjectにすると、同じアニメーションセットを必要とするエンティティタイプ/インスタンス間で共有されるアセットとして扱うことができ、それぞれのリストを複製するオーバーヘッドを回避できます。(他のクラスはUnityでインスタンスごとにシリアル化される傾向があります)。このルートに進むには、小さなエディタースクリプトを追加して、Assetsフォルダーにこれらのインスタンスを作成できるようにする必要があります。
編集:さらに簡単になりました-ScriptableObjectの上にこの属性を追加するだけです:
[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]
これにより、次のようにScriptableObjectが[作成]メニューに追加されます。
オプションで、インスペクターに表示されるように配列をプライベートにしてシリアル化できますが、より効率的な検索のためにクライアントが使用するパブリック辞書(またはパブリックGetAnimation(Spellスペル)メソッドを持つプライベート辞書)を追加できます。OnEnable()メソッドで、SpellAnimationMapはインスペクターが設定された配列を反復処理してこのディクショナリを構築し、すべてのクライアントインスタンス間でメリットを共有します。(OnEnable()は、アセットが最初に作成されたときにエディターでも呼び出されることに注意してください。そのため、読み取る前に配列がnullでないことを確認してください)
最後に、このエントリデータ型に必要なだけ追加できます。たとえば、プレハブ、またはスペルキーにリンクする他の任意の数のデータを含めることもできます。
また、Dictionary <、>フィールドに直接データを入力するカスタムインスペクターを作成することも可能ですが、私が得た印象は、スムーズに作業するのは面倒だということです。