zoukankan      html  css  js  c++  java
  • Unity 简易监听框架

    全局维护一个字典,字典中的key为字符串或者自定义类型,value为委托,

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    public delegate void CallBack();
    public delegate void CallBack<T>(T t);
    public delegate void CallBack<T, D>(T t, D d);
    public delegate void CallBack<T, D, U>(T t, D d, U u);
    
    public class Messenger
    {
        public static Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>();
    
        static void OnListenerAdding(string eventkey, Delegate listenerDelegate)
        {
            if (!eventTable.ContainsKey(eventkey))
            {
                eventTable.Add(eventkey, null);
            }
        }
        public static void AddListener(string eventtype, CallBack handler)
        {
            OnListenerAdding(eventtype, handler);
            eventTable[eventtype] = (eventTable[eventtype] as CallBack) + (handler);
        }
    
        public static void AddListener<T>(string eventtype, CallBack<T> handler)
        {
            OnListenerAdding(eventtype, handler);
            eventTable[eventtype] = (eventTable[eventtype] as CallBack<T>) + (handler);
        }
        public static void AddListener<T, D>(string eventtype, CallBack<T, D> handler)
        {
            OnListenerAdding(eventtype, handler);
            eventTable[eventtype] = (eventTable[eventtype] as CallBack<T, D>) + (handler);
        }
        public static void AddListener<T, D, U>(string eventtype, CallBack<T, D, U> handler)
        {
            OnListenerAdding(eventtype, handler);
            eventTable[eventtype] = (eventTable[eventtype] as CallBack<T, D, U>) + (handler);
        }
        static void OnBroadcast(string eventtype)
        {
            if (!eventTable.ContainsKey(eventtype))
            {
                Debug.LogError("不包含此监听");
                return;
            }
        }
    
        public static void Broadcast(string eventtype)
        {
            OnBroadcast(eventtype);
            CallBack callback;
            if (eventTable.ContainsKey(eventtype))
            {
                callback = eventTable[eventtype] as CallBack;
                callback?.Invoke();//如果不为空调用,unity2017以下不可简写
            }
        }
        public static void Broadcast<T>(string eventtype,T t)
        {
            OnBroadcast(eventtype);
            CallBack<T> callback;
            if (eventTable.ContainsKey(eventtype))
            {
                callback = eventTable[eventtype] as CallBack<T>;
                callback?.Invoke(t);//如果不为空调用,unity2017以下不可简写
            }
        }
        public static void Broadcast<T,D>(string eventtype, T t,D d)
        {
            OnBroadcast(eventtype);
            CallBack<T,D> callback;
            if (eventTable.ContainsKey(eventtype))
            {
                callback = eventTable[eventtype] as CallBack<T,D>;
                callback?.Invoke(t, d);//如果不为空调用,unity2017以下不可简写
            }
        }
        public static void Broadcast<T, D,U>(string eventtype, T t, D d,U u)
        {
            CallBack<T, D,U> callback;
            if (eventTable.ContainsKey(eventtype))
            {
                callback = eventTable[eventtype] as CallBack<T, D,U>;
                callback?.Invoke(t, d, u); //如果不为空调用,unity2017以下不可简写
            }
        }
    }
    

      

  • 相关阅读:
    JS 获取本月第一天零点时间戳并转化成yy-mm-dd
    JS 两个对象数组合并并去重
    element ui datePicker 设置当前日期之前的日期不可选
    整理一些vue elementui 问题 + 链接方法
    css 修改placeholder的颜色
    js循环内0.5s停止
    自定义border 为 dashed 时的虚线间距
    如何让浮动元素水平/垂直居中
    centos7.6设置sftp服务
    HikariCP Druid比较
  • 原文地址:https://www.cnblogs.com/lzy575566/p/7929861.html
Copyright © 2011-2022 走看看