如何在自定义检视面板中分配引用时调用函数?

3

当通过自定义编辑器分配引用时,我需要调用/触发一个函数。

在检查器之外,我会这样处理:

[SerializeField]
private SomeMember _someMemberRef;
public SomeMember someMemberRef{ get { return _someMemberRef; } set { _someMemberRef= value; someFunction(); } }

但是由于自定义检查器直接分配给了私有变量 _someMemberRef,因此 someFunction() 将不会被调用。

EditorGUILayout.PropertyField(serializedObject.FindProperty("_someMemberRef"));

当在检查器中进行赋值操作时,是否有一种方法可以调用/触发someFunction()函数?


那真的能编译吗? - maraaaaaaaa
也许有更好的方法来实现你想做的事情。在指派时,您需要更新什么呢? - maraaaaaaaa
我想在我的自定义检视器中显示一些额外的信息,这些信息是基于_someRef成员计算出来的。因此,当_someRef被另一个SomeClass对象引用替换时,我需要重新计算这些信息,因为_someRefs成员的值可能已经发生了变化。 - Simeon
1
我会添加一个重新计算按钮,或者您可以像这个链接所示的那样使用 OnInspectorGUI() 函数作为更新函数。http://answers.unity3d.com/questions/333181/how-do-you-force-a-custom-inspector-to-redraw.html - maraaaaaaaa
如果没有其他办法,我可能会在每次OnInspectorGUI()中调用它,但我不喜欢冗余的调用。我更喜欢只在必要时调用someFunction()。按钮的想法对某些人可能有用,但我会感到不舒服。 - Simeon
1个回答

0
假设自定义检查器所针对的类名为SomeClass,并且具有成员private SomeMember _someMemberRef,以及如上所述的public SomeMember someMemberRef getter和setter:

不要使用

EditorGUILayout.PropertyField(serializedObject.FindProperty("_someMemberRef"));

在相应的编辑器派生类中,可以使用。
SomeClass someClassRef = (SomeClass) target;
SomeMember someMemberRef = null;
someMemberRef = (SomeMember)EditorGUI.ObjectField(EditorGUILayout.GetControlRect(), "Some Member Ref", someClassRef.someMemberRef, typeof(SomeMember), false);
if (someMemberRef != someClassRef.someMemberRef)
{
    someClassRef.someMemberRef = someMemberRef;
    someClassRef.someFunction();
}

在检视面板中赋值时调用任何公共函数。如果有人不习惯使用矩形,它也适用于EditorGUILayout.ObjectField。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接