【问题标题】:SerializeField Indexed by Enum in ScriptableObjectScriptableObject 中由枚举索引的 SerializeField
【发布时间】:2021-04-14 05:48:04
【问题描述】:

如何在 Unity 编辑器的检查器中序列化数组/列表/字典,以使设计人员无需了解底层枚举索引。

如;

public enum foobar { foo, bar }
[SerializeField] List<string> optionsForTheDesigner = new List< string>();

在检查器中,这将显示为(最好使用 foo 和 bar 作为枚举下拉菜单);

然后在代码中访问为;

fooValueFromTheDesigner = optionsForTheDesigner[foobar.foo];
barValueFromTheDesigner = optionsForTheDesigner[foobar.bar];

而不是检查员展示;

如果它在 ScriptableObject 中有所不同。

编辑:为清楚起见,将“编辑器”更改为“检查器”。将文本示例更改为图片。

Edit2:我最终找到了类似于 rustyBucketBay 的答案的东西,但使用的是枚举而不是 int。这显示在编辑器中,如下所示。如果需要,我可以在运行时将其转换为枚举索引数组/列表,或者在构建之前使用辅助函数。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    就像注释一样,只能序列化数组和列表,不能序列化字典。检查docs

    您可以将枚举类型的名称获取到字符串数组。数组中项的索引将是枚举类型的索引,所以可以随意访问。

    using System;
    using UnityEngine;
    
    public enum foobar { foo, bar }
    
    public class GetEnumValues : MonoBehaviour
    {
        string[] optionsForTheDesigner;
        void Start() {
            optionsForTheDesigner = Enum.GetNames(typeof(foobar));
        }
    
        void Update() {
            if (Input.GetKeyDown(KeyCode.N)) {
                Debug.Log($"foo name: { optionsForTheDesigner[(int)foobar.foo]}");
            }
            if (Input.GetKeyDown(KeyCode.M)) {
                Debug.Log($"bar name: { optionsForTheDesigner[(int)foobar.bar]}");
            }
        }
    }
    

    日志结果:

    编辑:

    要执行您想做的事情,您不能使用enum。枚举是可序列化的,但据我所知,它们的值是在编译时设置的。如果字典或元组可以由统一编辑器序列化(与.Net 序列化不同),那么您想要实现的那种是可能的,但它们不是。检查docs

    要实现您想要的,您需要自己制作编辑器模板类,以便在检查器中使用,如下所示:

    [Serializable]
    class MyInspectorCoolClass {
        int myInt;
        string myString;
    }
    
    class MyMonoBehaviour: MonoBehaviour {
        public MyInspectorCoolClass myFields; //your fields will be displayed in the inspector
    }
    

    This 可能会有所帮助。

    【讨论】:

    • 谢谢。我已经将问题从编辑更新到检查员,因为我意识到我不清楚我想要枚举名称的位置。有没有办法将这些名称用作数组/列表索引,以便在检查器中查看所述数组/列表?
    • 这是避免在检查器中显示索引的另一个原因。也就是说,可以使用 enum foobar { foo = 0, bar = 1 } 在代码中设置枚举值。我最终找到了与您的建议类似的东西,但使用的是枚举而不是 int。我希望能够索引而不是不断地找到适当的记录,但我想我总是可以在第一次访问时将枚举值对列表转换为枚举索引数组。为了清楚起见,我将在问题底部添加一个屏幕截图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多