Как реализовать OnValueChange для любого поля класса типа в Unity - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь реализовать метод OnValueChanged, который будет вызываться автоматически при изменении целевого поля. Например, у меня есть класс MonoBehaviour в единице, и если его значение в enum-поле изменилось, выполните некоторый код. Вот псевдокод

public class SomeClass : MonoBehaviour {

   public enum SomeEnum { Value1, Value2 }

   public SomeEnum MyEnum;

   void Update() {
       if(MyEnum value isChanged){
           call OnMyEnumChanged();
       }    
   }

   public void OnMyEnumChanged() {

   }

}

Надеюсь, мой вопрос ясен, любые предложения высоко ценятся

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

После поиска информации в 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");
    }

}
1 голос
/ 22 марта 2020

Обычно мы реализуем 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));
        }
    }

}
...