如何在 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");
    }

}