Unity中的C#事件与回调:一个简单的实例分析

Unity开发过程中,事件和回调机制是实现组件间通信的重要手段。本文将通过一段实际的C#代码示例,展示如何在Unity中定义、触发事件以及订阅事件,从而实现在不同脚本(ScriptA 和 ScriptB)间的交互。

首先,我们创建一个名为ScriptA的MonoBehaviour类,其中包含一个自定义事件OnMyBoolChanged,该事件使用Action作为委托类型,表示当布尔值变化时需要执行的方法签名。同时声明了一个布尔变量myBool和一个Button组件引用button。

public class ScriptA : MonoBehaviour
{
    
    
    public event Action<bool> OnMyBoolChanged;

    public bool myBool;
    public Button button;

    void Start()
    {
    
    
        button.onClick.AddListener(TaskOnClick);
    }

    void TaskOnClick()
    {
    
    
        myBool = !myBool;
        OnMyBoolChanged?.Invoke(myBool); // 触发事件
    }
}

在上述代码中,我们在Start方法中给按钮注册了点击事件处理器TaskOnClick。当按钮被点击时,会将myBool取反并触发OnMyBoolChanged事件,并传递当前myBool的值。

接下来,在另一个MonoBehaviour类ScriptB中,我们将订阅ScriptA的OnMyBoolChanged事件:

// 在ScriptB中订阅这个事件
public class ScriptB : MonoBehaviour
{
    
    
    public ScriptA scriptA;

    void Start()
    {
    
    
        if (scriptA != null)
        {
    
    
            scriptA.OnMyBoolChanged += HandleMyBoolChanged;
        }
    }

    void OnDestroy()
    {
    
    
        if (scriptA != null)
        {
    
    
            scriptA.OnMyBoolChanged -= HandleMyBoolChanged; // 不要忘记在适当的时候取消订阅以防止内存泄漏
        }
    }

    void HandleMyBoolChanged(bool value)
    {
    
    
        if (value)
        {
    
    
            Debug.Log("你好");
        }
        else
        {
    
    
            Debug.Log("不好");
        }
    }
}

在ScriptB中,我们在Start方法中检查scriptA是否非空,如果有效,则订阅OnMyBoolChanged事件,并关联到HandleMyBoolChanged方法。当ScriptA中的myBool发生变化并触发事件时,ScriptB的HandleMyBoolChanged方法会被调用,根据传入的布尔值打印不同的日志信息。

最后,在OnDestroy方法中,确保在对象销毁时解除对OnMyBoolChanged事件的订阅,这是为了避免内存泄漏问题,保持程序的良好性能和稳定性。

总结,通过以上代码示例,我们可以直观地了解到Unity中C#事件和回调机制的应用场景及其实现方式,为更复杂的游戏逻辑交互设计提供了基础框架。

猜你喜欢

转载自blog.csdn.net/weixin_52051554/article/details/138157667