SerializedProperty避免吸气?

时间:2015-09-09 11:10:45

标签: unity3d

我使用getter和setter作为变量,以避免检查它们是否为null。在大多数情况下,我也不需要Start()和Awake()函数。

    public Button[] TitlebarButtons
    {
        get { return titlebar_buttons ?? (titlebar_buttons = GetComponentsInChildren<Button>()); }
    }
    private Button[] titlebar_buttons;

    public Color CloseButtonNormalColor
    {
        get { return TitlebarButtons[2].colors.normalColor; }
        set
        {
            ColorBlock temp = ColorBlock.defaultColorBlock;
            temp.normalColor = value;
            temp.highlightedColor = TitlebarButtons[2].colors.highlightedColor;
            temp.pressedColor = TitlebarButtons[2].colors.pressedColor;

            TitlebarButtons[2].colors = temp;
        }
    }

在编辑器脚本中,我试图使CloseButtonNormalColor成为一个序列化属性:

private Title Title;
private SerializedProperty close_button_normal_color;

void OnEnable()
{
    Title = (Title)target;

    close_button_normal_color = serializedObject.FindProperty("CloseButtonNormalColor");
}

但是当我使用它时,会出现NullReferenceExeption。

close_button_normal_color.colorValue = EditorGUILayout.ColorField("Normal", close_button_normal_color.colorValue);

有没有解决方案?

2 个答案:

答案 0 :(得分:0)

通常只需公开检查器上的属性即可使用

[ShowProperty]
public MyProperty {get; set;}

和字段

[SerializeField]
private myField;

答案 1 :(得分:0)

我为此找到了两个“解决方法”。

一个来自统一论坛的这个帖子:

https://forum.unity.com/threads/using-property-fields-in-custom-editor-when-using-auto-properties.828597/

因此,您可以:

public class ClassToCustomEditor
{
    [field:SerializeField] public int CustomEditorProperty { get; set; }
}

然后在您的自定义编辑器脚本中:

 void OnEnable()
 {
    IsCraftable = serializedObject.FindProperty(
        string.Format("<{0}>k__BackingField", "IsCraftable")
    );
 }

对我来说,在 Unity 2020.1.14f1 中就像一个魅力。如果您需要更多详细信息,我建议您访问上面的线程。

另一种解决方法是创建私有字段(其 FindProperty 查找),然后创建访问和修改这些字段的属性。

类似于:

public class MyClassToCustomEditor
{
    [SerializeField] private string itemName;

    public string ItemName
    {
        get { return itemName; }
        set { itemName = value; }
    }
}

然后 FindProperty 将能够按照您编写的方式找到它。