Unity-检查器中自定义结构的绘制

时间:2019-02-18 13:59:49

标签: c# unity3d struct unity3d-editor unity-editor

我有一个自定义结构,带有以下代码:

[Serializable]
public struct HexPoint : IEquatable<HexPoint>
{
    public readonly int x;
    public readonly int y;
    public readonly int z;

    // Some custom methods for initializations and operators
}

如果我将x,y和z变量设置为非只读,则它们会很好地显示在统一检查器中。但是,我有一些他们需要满足的规则(实际上x + y + z = 0),因此我添加了只读权限,以防止人们惹它。

但是作为只读变量,它们不会显示(因为它们不能被修改)! :(

我想知道它们是否是我可以在统一检查器中显示它们的一种方式,它类似于PropertyDrawer。我知道我可以将结构切换到类,因为PropertyDrawer是为类保留的,但是我想将其保留为结构。

那么,有没有一种显示值的方法?最终使用自定义初始化程序修改它们?

非常感谢!

1 个答案:

答案 0 :(得分:3)

readonly也使它们也non-serialized->在检查器中不显示


实际上不需要CustomPropertyDrawer

您可以使用公开的只读properties来访问私有字段,并使用[SerializeField]将其显示在检查器中:

[Serializable]
public struct HexPoint : IEquatable<HexPoint>
{
    // Those are not displayed in the inspector, 
    // readonly and accessible by other classes
    public int x { get { return _x; }}
    public int y { get { return _y; }}
    public int z { get { return _z; }}

    // if you prefer you can also use the expression body style instead
    //public int x => _x;
    //public int y => _y;
    //public int z => _z;

    // Those are displayed in the Inspector
    // but private and therefor not changable by other classes
    [SerializeField] private int _x;
    [SerializeField] private int _y;
    [SerializeField] private int _z;
}

提示,检查更改MonoBehaviour.OnValidate后的值可能对您来说很有趣