Unity监听某个值是否改变,c#数值监听器
功能监听某个值的变化,当监听到变化之后执行对应的注册事件。
需要创建一个监听器对应,每监听一个值就要创建一个监听器对象,监听器是泛型,需要填写监听的类型。
创建监听器完毕后为监听器赋初值,
并添加监听方法,
不能监听自己创建对象的属性值
比如:
public class Student
{public int age = 0;public int tall;
}
不能监听age或者tall
using System;
using System.Collections.Generic;/// <summary>
/// 值变化监听器
/// </summary>
/// <typeparam name="T"></typeparam>
public class MonitorValueChange<T>
{// 定义一个事件,当值发生变化时触发public event Action<T> OnValueChanged;// 定义一个属性来存储和监听值的变化private T _value;public T Value{get { return _value; }set{if (!EqualityComparer<T>.Default.Equals(_value, value)){_value = value;// 触发事件OnValueChanged?.Invoke(_value);}}}// 提供一个方法来注册事件监听器public void RegisterListener(Action<T> listener){OnValueChanged += listener;}// 提供一个方法来注销事件监听器public void UnregisterListener(Action<T> listener){OnValueChanged -= listener;}
}
using UnityEngine;public class NewBehaviourScript : MonoBehaviour
{//创建监听器public MonitorValueChange<int> levelNotifier = new MonitorValueChange<int>();public MonitorValueChange<string> nameNotifier = new MonitorValueChange<string>();void Start(){// 初始化时传入需要监听的值levelNotifier.Value = 1;// 注册事件监听器levelNotifier.RegisterListener(HandleLevelChanged);//监听stringnameNotifier.Value = "name";nameNotifier.RegisterListener(NameChange);}void OnDestroy(){// 注销事件监听器levelNotifier.UnregisterListener(HandleLevelChanged);nameNotifier.UnregisterListener(NameChange);}// 事件处理方法private void HandleLevelChanged(int newLevel){Debug.Log("Level changed to: " + newLevel);}private void NameChange(string name){//方法中传递过来的内容是:namehello man Debug.Log("方法中传递过来的内容是:" + name);}void Update(){// 模拟值的变化if (Input.GetKeyDown(KeyCode.Space)){levelNotifier.Value++;nameNotifier.Value += "hello man ";}}
}