Unity - пользовательский рисунок структуры в инспекторе - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть пользовательская структура со следующим кодом:

[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), поэтому я добавил readonly, чтобы люди не связывались с ним.

Но как переменные только для чтения, они не отображаются (так как они не могут быть изменены)!: (

Мне было интересно, что они позволяют мне отображать их в инспекторе единиц, с чем-то похожим на PropertyDrawer. Я знаю, что могу переключить свою структуру на класс, так как PropertyDrawer зарезервирован дляклассы, но я хотел бы сохранить его в виде структуры.

Итак, есть ли способ отобразить значения? И в конечном итоге изменить их с помощью пользовательских инициализаторов?

Большое спасибо!

1 Ответ

0 голосов
/ 18 февраля 2019

readonly делает их также non-serialized -> не отображаются в Инспекторе


На самом деле CustomPropertyDrawer не требуется.

Вы можете иметь общедоступные свойства только для чтения для доступа к закрытым полям и их отображения в Инспекторе. Используйте [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 может вас заинтересовать

...