在Unity检查器中获取键-值对的一种快速方法是定义一个可序列化的入口类,然后使用它们的数组或List <>。例如...
public class SpellAnimationMap : ScriptableObject
{
[System.Serializable]
public class SpellAnimationEntry
{
public Spell spell;
public AnimationClip animation;
}
public SpellAnimationEntry[] spellAnimations;
}
这将自动为您提供检查器中可调整大小的列表,您可以在其中输入键和值,而无需编写自定义检查器。
结果看起来像这样:
(一个技巧:如果序列化的入口类包含一个“名称”字段,将显示该字符串,而不是平淡的“元素0”标题。如果您要处理更复杂的数据,则很有用。)
将其设置为ScriptableObject可使您将其视为需要相同动画集的实体类型/实例之间共享的资产,从而避免了为每个实体/列表重复副本的开销。(其他类倾向于在Unity中按实例序列化)。要走这条路,您需要添加一个小的编辑器脚本,以使您可以在Assets文件夹中创建这些脚本的实例。
编辑:现在更容易- 您可以在ScriptableObject上方添加此属性:
[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]
这会将ScriptableObject放入“创建”菜单,如下所示:
您可以选择将数组设置为私有并进行序列化,以使其仍显示在检查器中,但可以添加公共词典(或具有公共GetAnimation(Spell spell)方法的私有词典)供客户端使用,以进行更有效的查找。在其OnEnable()方法中,SpellAnimationMap可以遍历其检查器填充的数组以一次构建此字典,从而再次在所有客户端实例之间共享收益。(请注意,首次创建资产时,也会在编辑器中调用OnEnable(),因此请确保在尝试读取数组之前检查数组是否为空)
最后,您可以根据需要在此条目数据类型中添加尽可能多的内容。例如,它也可以包括预制件,或者您想要链接到拼写键的任何其他数量的数据。
也可以编写自定义检查器来直接填充Dictionary <,>字段,但是我得到的印象是顺利进行工作很麻烦。