C# 如何为Unity中的任何类型类字段实现OnValueChange
我正在尝试实现OnValueChanged方法,当目标字段发生更改时,它将自动调用OnValueChanged方法。例如,我在unity中有一个MonoBehavior类,如果它的枚举字段值发生了更改,那么执行一些代码。这是伪代码C# 如何为Unity中的任何类型类字段实现OnValueChange,c#,unity3d,game-development,C#,Unity3d,Game Development,我正在尝试实现OnValueChanged方法,当目标字段发生更改时,它将自动调用OnValueChanged方法。例如,我在unity中有一个MonoBehavior类,如果它的枚举字段值发生了更改,那么执行一些代码。这是伪代码 public class SomeClass : MonoBehaviour { public enum SomeEnum { Value1, Value2 } public SomeEnum MyEnum; void Update() {
public class SomeClass : MonoBehaviour {
public enum SomeEnum { Value1, Value2 }
public SomeEnum MyEnum;
void Update() {
if(MyEnum value isChanged){
call OnMyEnumChanged();
}
}
public void OnMyEnumChanged() {
}
}
希望我的问题是清楚的,任何建议都会得到高度赞赏通常我们会实施
INotifyPropertyChanged
,但我不知道在Mono/Unity中会有多大进展
为了它的价值:
using System.ComponentModel;
public class SomeClass : MonoBehaviour, INotifyPropertyChanged {
public enum SomeEnum { Value1, Value2 }
SomeEnum myEnum
public SomeEnum MyEnum
{
get { return myEnum; }
set
{
if (myEnum == value)
return;
myEnum = value;
OnPropertyChanged("MyEnum");
}
}
void Update() {
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在google上查找了一些信息后,我找到了OnValidate方法,当编辑器/检查器中的内容发生更改时,会调用该方法。这是我为处理编辑器中的值更改而编写的代码
public class SomeClass : MonoBehaviour {
public enum SomeEnum { Value1, Value2 }
public SomeEnum SomeEnumProperty {
get => myEnum;
set {
if (myEnumObserver == value)
return;
myEnum = value;
myEnumObserver = myEnum;
OnMyEnumChanged();
}
}
[SerializeField]
private SomeEnum myEnum;
private SomeEnum myEnumObserver;
void OnValidate() {
if (SomeEnumProperty != myEnumObserver) {
SomeEnumProperty = myEnum;
}
}
void Update() {
}
public void OnMyEnumChanged() {
Debug.Log("ValueChanged Called");
}
}
在GET上设置一个吸收器和设置器,在设置时,调用OnEngEngEdiDI的一个裁剪器,但是它不起作用,因为当我从统一编辑器中改变值时,如果您在编辑器中使用此脚本,请考虑使用<代码> ExeCuTeEnEddie> < /Cord>属性。不,不,这不是我想要的want@UnityDev如果更改了枚举字段值,则定义
。。您是指代码还是通过Inspector?我认为您需要交换这些行的顺序:myEnum=value代码>myEnumObserver=myEnum
您还应该完全删除现在为空的Update
方法!Unity会在它存在时立即调用它,这只会浪费资源。另外,OnValidate
仅在UnityEditor中调用。。不是在内置游戏中,您还应该完全删除现在为空的Update
方法!不管怎样,只要它一存在,团结就会召唤它,这只是浪费resources@UnityDev你的具体情况是什么?我的情况是,当我的自定义枚举值发生变化时,我想调用一些方法,我这样做了,谢谢你help@derHugo我怀疑团结会成为一种私人方法。这只是为了举例说明,我从Update()
中删除了代码,这就是我留下它的原因。@rfmodulator以及您认为如何调用这些代码?Unity将它们作为消息调用(如果它们存在的话;)他们是否是私人的并不重要。在这种情况下,至少要把它注释掉;)