Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为Unity中的任何类型类字段实现OnValueChange_C#_Unity3d_Game Development - Fatal编程技术网

C# 如何为Unity中的任何类型类字段实现OnValueChange

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() {

我正在尝试实现OnValueChanged方法,当目标字段发生更改时,它将自动调用OnValueChanged方法。例如,我在unity中有一个MonoBehavior类,如果它的枚举字段值发生了更改,那么执行一些代码。这是伪代码

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将它们作为消息调用(如果它们存在的话;)他们是否是私人的并不重要。在这种情况下,至少要把它注释掉;)