事件派发,监听

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class EventDispatch
{
    [SLua.DoNotToLua]
    public delegate void OnNotificationDelegate(Notification note);
    private Dictionary<string, OnNotificationDelegate> _eventListeners;

     [SLua.DoNotToLua]
    public virtual void Clear()
    {

    }

     [SLua.DoNotToLua]
    public  EventDispatch()
    {
        _eventListeners = new Dictionary<string, OnNotificationDelegate>();
    }

    /// <summary>
    /// 添加事件侦听
    /// </summary>
    /// <param name="type"></param>
    /// <param name="listener"></param>
    public void AddEventListener(string type, OnNotificationDelegate listener)
    {
        if (!_eventListeners.ContainsKey(type))
        {
            OnNotificationDelegate delegat = null;
            _eventListeners[type] = delegat;
        }

        _eventListeners[type] += listener;
    }

    /// <summary>
    /// 添加事件侦听
    /// </summary>
    /// <param name="type"></param>
    /// <param name="listener"></param>
    public void AddEventListenerAndRemove(string type, OnNotificationDelegate listener)
    {
        RemoveEventListener(type);
        if (!_eventListeners.ContainsKey(type))
        {
            OnNotificationDelegate delegat = null;
            _eventListeners[type] = delegat;
        }

        _eventListeners[type] += listener;
    }
    /// <summary>
    /// 移除事件侦听
    /// </summary>
    /// <param name="type"></param>
    /// <param name="listener"></param>
    public void RemoveEventListener(string type,OnNotificationDelegate listener)
    {
        if (!_eventListeners.ContainsKey(type))
        {
            return;
        }

        _eventListeners[type] -= listener;

        if (_eventListeners[type] == null)
        {
            _eventListeners.Remove(type);
        }
    }

    /// <summary>
    /// 移除某一类事件侦听
    /// </summary>
    /// <param name="type"></param>
    public void RemoveEventListener(string type)
    {
        if (_eventListeners.ContainsKey(type))
        {
            _eventListeners.Remove(type);
        }
    }
    /// <summary>
    /// 派发数据
    /// </summary>
    /// <param name="type"></param>
    /// <param name="note"></param>
    public void DispatchEvent(string type, Notification note)
    {
        if (_eventListeners.ContainsKey(type))
        {
            _eventListeners[type](note);
        }
    }

    /// <summary>
    /// 派发:无数据
    /// </summary>
    /// <param name="type"></param>
    public void DispatchEvent(string type)
    {
        DispatchEvent(type, null);
    }

    /// <summary>
    /// 是否有type类型的事件侦听
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    [SLua.DoNotToLua]
    public bool HasEventListener(string type)
    {
        return _eventListeners.ContainsKey(type);
    }


}
Unity中,事件派发、注册和监听可以通过以下几个步骤完成: 1. 创建自定义事件类 首先,我们需要创建一个自定义事件类,这个类需要继承自`UnityEvent`类。例如,我们可以创建一个名为`MyEvent`的事件类: ```csharp using UnityEngine.Events; public class MyEvent : UnityEvent<int, string> {} ``` 在上面的代码中,我们定义了一个名为`MyEvent`的自定义事件类,它可以传递两个参数:一个整数和一个字符串。 2. 发送事件 要发送事件,我们需要获取对事件管理器的引用,并使用`Invoke`方法触发事件。例如,我们可以在一个名为`MySender`的脚本中发送事件: ```csharp public class MySender : MonoBehaviour { private MyEvent myEvent; private void Start() { myEvent = new MyEvent(); myEvent.AddListener(OnMyEvent); myEvent.Invoke(42, "hello"); } private void OnMyEvent(int intParam, string stringParam) { Debug.LogFormat("MyEvent received with params: {0}, {1}", intParam, stringParam); } } ``` 在上面的代码中,我们创建了一个`MyEvent`对象,并添加了一个事件侦听器。调用`Invoke`方法将触发事件,并将整数值42和字符串值“hello”传递给事件侦听器。 3. 注册事件侦听器 要注册事件侦听器,我们需要获取对事件管理器的引用,并使用`AddListener`方法将侦听器添加到事件列表中。例如,我们可以在一个名为`MyListener`的脚本中注册事件侦听器: ```csharp public class MyListener : MonoBehaviour { private MyEvent myEvent; private void OnEnable() { myEvent = new MyEvent(); myEvent.AddListener(OnMyEvent); } private void OnDisable() { myEvent.RemoveListener(OnMyEvent); } private void OnMyEvent(int intParam, string stringParam) { Debug.LogFormat("MyEvent received with params: {0}, {1}", intParam, stringParam); } } ``` 在上面的代码中,我们在`OnEnable`方法中注册事件侦听器,并在`OnDisable`方法中注销事件侦听器。每当`MyEvent`被触发时,`OnMyEvent`方法将被调用,并将传递的参数打印到控制台中。 总之,Unity提供了一个强大的事件系统,使得我们可以轻松地实现事件派发、注册和监听。通过自定义事件类、使用`AddListener`和`Invoke`方法,我们可以在游戏中实现各种事件,并响应它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值