【Unity】自定义事件实现,管理

本文探讨了如何在Unity中创建自定义事件系统,以增强 MVC 模式的灵活性,解决Unity内建机制的不足。

事件机制广泛应用于mvc模式中,灵活的事件机制能够弥补Unity中的一些缺陷

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EventManager :MonoBehaviour {

    public delegate void Callback();
    public delegate void CallbackPrm(params object[] prm);

    public static EventManager _Event;
    // 最终结束回调字典
    private Dictionary<string, CallbackPrm> _myEventCallback = new Dictionary<string, CallbackPrm>();

    // 最终结束一次回调字典
    private Dictionary<string, CallbackPrm> _myEventOnceCallback = new Dictionary<string, CallbackPrm>();
    
    void Awake()
    {
        _Event = this;
    }
    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    /// <summary>
    /// 添加事件
    /// </summary>
    /// <param name="name"> 事件名称 </param>
    /// <param name="callback"> 带参事件 </param>
    public void AddEvent(string name, CallbackPrm callback)
    {
        if (_myEventCallback.ContainsKey(name))
        {
            Debug.Log("Events already exist (CallbackPrm)");
        }
        else
        {
            _myEventCallback.Add(name, callback);
        }
    }

    /// <summary>
    /// 添加事件
    /// </summary>
    /// <param name="name"> 动画名称 </param>
    /// <param name="callback"> 不带参事件 </param>
    public void AddEvent(string name, Callback callback)
    {
        if (_myEventCallback.ContainsKey(name))
        {
            Debug.Log("Events already exist (callback)");
        }
        else
        {
            _myEventCallback.Add(name,(object[] o)=> { callback(); });
        }
    }

    /// <summary>
    /// 添加执行一次事件
    /// </summary>
    /// <param name="name"> 事件名称 </param>
    /// <param name="callback"> 带参事件 </param>
    public void AddOnceEvent(string name, CallbackPrm callback)
    {
        if (_myEventOnceCallback.ContainsKey(name))
        {
            Debug.Log("Events already exist (CallbackPrm)");
        }
        else
        {
            _myEventOnceCallback.Add(name, callback);
        }
    }

    /// <summary>
    /// 添加执行一次事件
    /// </summary>
    /// <param name="name"> 动画名称 </param>
    /// <param name="callback"> 不带参事件 </param>
    public void AddOnceEvent(string name, Callback callback)
    {
        if (_myEventOnceCallback.ContainsKey(name))
        {
            Debug.Log("Events already exist (callback)");
        }
        else
        {
            _myEventOnceCallback.Add(name, (object[] o) => { callback(); });
        }
    }

    /// <summary>
    /// 派发事件
    /// </summary>
    /// <param name="name"> 事件名称 </param>
    public void DispatchEvent(string name,params object[] o)
    {
        if (_myEventCallback.ContainsKey(name))
        {
            _myEventCallback[name](o);
        }
        else if (_myEventOnceCallback.ContainsKey(name))
        {
            _myEventOnceCallback[name](o);
            _myEventOnceCallback.Remove(name);
            //Debug.Log("err : 未注册 "+ name);
        }
        else {
            Debug.Log("err : 未注册 " + name);
        }
    }

    /// <summary>
    /// 清理事件
    /// </summary>
    /// <param name="name"> 事件名称 </param>
    public void ClearEvent(string name)
    {
        if (_myEventCallback.ContainsKey(name))
        {
            _myEventCallback.Remove(name);
        }
        if (_myEventOnceCallback.ContainsKey(name))
        {
            _myEventOnceCallback.Remove(name);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值