C#——Unity事件监听器
事件监听器
事件类型
public enum BaseHEventType {
    GAME_OVER,
    GAME_WIN,
    PAUSE,
    ENERGY_EMEPTy,
    GAME_DATA
}
事件基类
public class BaseHEvent
{
    protected Hashtable m_arguments;
    protected BaseHEventType m_type;
    protected Object m_Sender;
    public IDictionary Params {
        get { return this.m_arguments; }
        set { this.m_arguments = (value as Hashtable); }
    }
    public BaseHEventType Type {//事件类型 构造函数会给Type 和Sender赋值
        get { return this.m_type; }
        set { this.m_type = value; }
    }
    public Object Sender {//物体
        get { return this.m_Sender; }
        set { this.m_Sender = value; }
    }
    public override string ToString()
    {
        return this.m_type + "[" + ((this.m_Sender == null) ? "null" : this.m_Sender.ToString()) + "]";
    }
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="type"> 事件类型 </param>
    /// <param name="sender"> 物体 </param>
    public BaseHEvent(BaseHEventType type, Object sender)
    {
        this.Type = type;
        Sender = sender;
        if (this.m_arguments == null)
        {
            this.m_arguments = new Hashtable();
            Debug.LogError("this.m_arguments" + this.m_arguments.Count);
        }
    }
    public BaseHEvent (BaseHEventType type,Hashtable args,Object sender)
    {
        this.Type = type;
        this.m_arguments = args;
        Sender = sender;
        if (this.m_arguments == null)
        {
            this.m_arguments = new Hashtable();
        }
    }
    public BaseHEvent Clone()
    {
        return new BaseHEvent(this.m_type, this.m_arguments, Sender);
    }
}
事件机制
public delegate void HEventListenerDelegate(BaseHEvent hEvent);//定义委托用于传事件基类
public class HEventDispatcher
{
    static HEventDispatcher Instance;
    public static HEventDispatcher GetInstance()//单利
    {
        if (Instance == null)
        {
            Instance = new HEventDispatcher();
        }
        return Instance;
    }
    private Hashtable listeners = new Hashtable(); //掌控所有类型的委托事件
    public void AddEventListener(BaseHEventType type,HEventListenerDelegate listener)
    {
        HEventListenerDelegate hEventListenerDelegate = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null
        hEventListenerDelegate = (HEventListenerDelegate) Delegate.Combine(hEventListenerDelegate, listener);//将两个委托的调用列表连接在一起,成为一个新的委托
        this.listeners[type] = hEventListenerDelegate;//赋值给哈希表中的这个类型
    }
    public void RemoveEventListener(BaseHEventType type, HEventListenerDelegate listener)
    {
        HEventListenerDelegate hEventListener = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null
        if (hEventListener != null)
        {
            hEventListener =(HEventListenerDelegate)Delegate.Remove(hEventListener, listener);//从hEventListener的调用列表中移除listener
            this.listeners[type] = hEventListener;//赋值给哈希表中的这个类型
        }
    }
    public void DispatchEvent(BaseHEvent baseH)
    {
        HEventListenerDelegate hEventListener = this.listeners[baseH.Type] as HEventListenerDelegate;
        if (hEventListener != null)
        {
            try
            {
                hEventListener(baseH);//执行委托
            }
            catch (Exception e)
            {
                throw new System.Exception(string.Concat(new string[] { "Error Dispatch event", baseH.Type.ToString(), ":", e.Message, " ", e.StackTrace }), e);
            }
        }
    }
    public void RemoveAll()
    {
        this.listeners.Clear();
    }
}
调用方法 下面是我在Unity当中调用的
    //注册/添加事件
    void Start()
    {
        HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA,StartHEvent);
        HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA, StartDataEvent);
        HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_WIN,StopHEvent);
    }
    //事件分发
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_DATA, this));
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_WIN, this));
        }
    }
    //事件移除
    private void OnDestroy()
    {
        HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_DATA, StartHEvent);
        HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_WIN, StopHEvent);
    }
    //添加事件方法
    void StartDataEvent(BaseHEvent hEvent)
    {
        Debug.Log("Doule" +hEvent.ToString());
    }
    void StartHEvent(BaseHEvent hEvent)
    {
        Debug.Log("StartHEvent + HEvent" + hEvent.ToString());
    }
    void StopHEvent(BaseHEvent hEvent)
    {
        Debug.Log("StopHEvent + HEvent" + hEvent.ToString());
    }
C#——Unity事件监听器的更多相关文章
- passive 的事件监听器
		很久以前,addEventListener() 的参数约定是这样的: addEventListener(type, listener, useCapture) 后来,最后一个参数,也就是控制监听器是在 ... 
- js事件监听器用法实例详解
		这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分 ... 
- Java基础之处理事件——实现低级事件监听器(Sketcher 2 implementing a low-level listener)
		控制台程序. 定义事件监听器的类必须实现监听器接口.所有的事件监听器接口都扩展了java.util.EventListener接口.这个接口没有声明任何方法,仅仅用于表示监听器对象.使用EventLi ... 
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)
		本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ... 
- Android编程: 界面组成、事件监听器
		学习知识:界面组成.事件监听器 ====界面组成==== 1.用户界面的基本组件叫做View,都是继承android.view.View类,Android里面预定义很多基本的界面组件,比如 Butto ... 
- Hibernate拦截器(Interceptor)与事件监听器(Listener)
		拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦 ... 
- Android事件监听器Event Listener
		在 Android 中,我们可以通过事件处理使UI与用户互动(UI Events). UI的用户事件处理,即View处理用户的操作,在应用程序中几乎不可避免.View是重要的类,它是与用户互动的前线: ... 
- Servlet事件监听器
		监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 面试题:请描述一下java事件监听机 ... 
- 第13章 Swing程序设计----常用事件监听器
		组件本身并不带有任何功能.这时需要为这些组件添加特定事件监听器. Swing中常用的两个事件监听器,即动作事件监听器和焦点事件监听器. 
随机推荐
- 2019.NET Conf China(中国.NET开发者峰会)活动全纪录:.NET技术之崛起,已势不可挡
			一.微软走向开放与.NET Core的诞生 当今时代,气象更新,技术飞速发展. 当今时代,开发者大概是最优秀的群体.每一位开发者,无不奋勇向前,努力追寻时代的步伐,以大无畏的精神迎接挑战,紧跟大时代成 ... 
- js 将base64转为图片
			var imgurl = response.data; $(".codeimg").attr('src','data:image/png;base64,'+imgurl); var ... 
- 浅谈OI中的底层优化!
			众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ... 
- C表达式中的汇编指令
			C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 a ... 
- Linux学习(推荐学习资源)——保持更新
			1. 介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Unix工具软件.应用程序和网络协议. ... 
- 创建windows系统下的虚拟机
			创建新的虚拟机 添加映像(windows系统下必须先添加映像) 选择相应的镜像文件:网上查找密钥输入:版本按要求选择:单击 下一步:设置虚拟机名称 位置 :下一步 默认的磁盘大小(不用管)——下一 ... 
- python面向对象<三>
			类属性.实例属性: class Tool(object): #属性(类属性)类对象(Tool) num = 0 #方法 def __init__(self,new_name): self.name = ... 
- 201871010114-李岩松《面向对象程序设计(java)》第十周学习总结
			项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ... 
- 装上linux后的准备工作
			A.修改对应网卡的IP地址的配置文件 1 2 3 4 5 6 7 8 # vi /etc/sysconfig/network-scripts/ifcfg-eth0 IPV6INIT=no #关闭 ... 
- 服务器上传文件到oss,以及备份
			公司的前端js,css是发布到oss的,所以要求后台在发布的同时先把即将要覆盖的文件备份到服务器上 步骤是先上传文件到服务器,服务器上传到oss服务器之前先备份相同文件名的文件 public clas ... 
