自学内容网 自学内容网

Unity监听某个值是否改变,c#数值监听器

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);

        //监听string
        nameNotifier.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 ";
        }
    }     
}


原文地址:https://blog.csdn.net/GoodCooking/article/details/140636871

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!