如何在 Unity 中为任何类型 class 字段实现 OnValueChange
How to implement OnValueChange for any type class field in Unity
我正在尝试实现 OnValueChanged 方法,该方法将在目标字段更改时自动调用。例如,我统一有一个 MonoBehaviour class,如果它的枚举字段值发生更改,则执行一些代码。这是伪代码
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 方法,当某些内容从 editor/inspector 发生更改时会调用该方法。这是我编写的用于处理编辑器
的值更改的代码
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");
}
}
我正在尝试实现 OnValueChanged 方法,该方法将在目标字段更改时自动调用。例如,我统一有一个 MonoBehaviour class,如果它的枚举字段值发生更改,则执行一些代码。这是伪代码
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 方法,当某些内容从 editor/inspector 发生更改时会调用该方法。这是我编写的用于处理编辑器
的值更改的代码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");
}
}