我使用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);
有没有解决方案?
答案 0 :(得分:0)
通常只需公开检查器上的属性即可使用
[ShowProperty]
public MyProperty {get; set;}
和字段
[SerializeField]
private myField;
答案 1 :(得分:0)
我为此找到了两个“解决方法”。
一个来自统一论坛的这个帖子:
因此,您可以:
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 将能够按照您编写的方式找到它。