Unity 委托使用(2)
来源:互联网 发布:网络博客钱能追回来吗 编辑:程序博客网 时间:2024/06/03 16:15
一个监听对象触发多个委托方法~~~~~~~~~~~~~~~~~~~~~
关于委托,简单又不简单,挺饶人的。。。
下面一则逻辑,就是使用委托来完成的,它主要是通过一个类来统一管理委托,包括添加监听事件、删去监听事件、挂起监听事件。
作用:
1、 可用来添加相同数据类型的事件,通过数据类型来调用所有被监听的同一数据类型的事件
2、 可用来添加不同数据类型的事件,通过数据类型来调用被监听的事件
优点在于便于管理,可以注册所有数据类型的委托方法,
但是可以只让其中具有相同数据类型的委托方法执行,其他数据类型的委托方法不执行。(可以部分委托方法执行)
而一般“ += ”添加注册委托的方法,则不能一次只执行其中一部分的委托。(不可以部分委托方法执行)
单例类,用来统一管理委托的脚本:
using System;using System.Collections.Generic;using UnityEngine;public class EventArgs{}public class EventManager{public static EventManager _eventManager;public static EventManager GetInstance(){if(_eventManager ==null){_eventManager = new EventManager();}return _eventManager;}//定义委托,带有一个参数e方法,类型为T//T相当于类型的泛型,可以代指任何类型,比如ing,sting等等。EventDelegate<T>是类数据类型public delegate void EventDelegate<T>(T e) where T: EventArgs;//定义字典,_daletatereadonly Dictionary <Type,Delegate> _delegate = new Dictionary<Type, Delegate>();//添加监听public void AddListener <T> (EventDelegate<T> listener) where T: EventArgs//参数表示事件{Delegate d;//获取与制定键相关联的值,放入d中,没有则为false,有则为true。if(_delegate.TryGetValue(typeof(T),out d)){//Combine()新的委托,它的调用列表将 d 和 listener 的调用列表按该顺序连接在一起。 如果 listener 为 null,//则返回 d,如果 d 为空引用,则返回 listener,如果 d 和 listener 均为空引用,则返回空引用。 _delegate[typeof(T)] = Delegate.Combine(d,listener);//连接在同一字典下}else{//键对应的值_delegate[typeof(T)] = listener;}}//移除监听public void RemoveListener <T> ( EventDelegate<T> listener )where T:EventArgs{Delegate d;if(_delegate.TryGetValue(typeof(T),out d)){//如果d中找到了listener列表,则移去listener列表;如果listener为null,则返回d;如果d为空引用,则返回null;//一个新委托,其调用列表的构成方法为:获取 source 的调用列表,如果在 source 的调用列表中找到了 value 的调用列表,则从中移除 value 的最后一个调用列表。// 如果 value 为 null,或在 source 的调用列表中没有找到 value 的调用列表,则返回 source。 如果 value 的调用列表等于 source 的调用列表,或 source 为空引用,则返回空引用。 Delegate currentDel = Delegate.Remove(d,listener);if(currentDel == null){_delegate.Remove(typeof(T));}else{//如果d中没有listener,返回d,赋值给currentDel表示返回原委托列表,放回原字典中//如果d中有listener,移去listener,返回d,赋值给currentDel表示返回原委托列表,放回原字典中_delegate[typeof(T)] = currentDel;}}}//执行指定类型T的委托public void Raise <T> (T e) where T :EventArgs{if(e == null){throw new ArgumentException("e");}Delegate d;if(_delegate.TryGetValue(typeof(T),out d)){EventDelegate <T> callback = d as EventDelegate<T>;if(callback != null){//执行委托callback(e);}}}}
向EventManager中添加注册事件,逻辑如下:
using UnityEngine; using System.Collections; public class EventListener : MonoBehaviour { void Start () { EventManager.GetInstance().AddListener<EventArgs>(OnReceive); } public void OnReceive(EventArgs e) { print("Lee");} }
定义UIEventArgs类继承EventArgs类,自定义新的数据类型,向EventManager中添加注册事件,逻辑如下:
using UnityEngine;using System.Collections;public class UIEventArgs : EventArgs {private bool _isOpen; public bool IsOpen { get { return _isOpen; } set { _isOpen = value; } } }
使用新定义的数据类型,注册事件
using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour {void Start () { EventManager.GetInstance().AddListener<UIEventArgs>(OnReceiveTwo); } void OnReceiveTwo(UIEventArgs e) { print("Guan");} }
【参考】http://blog.csdn.net/nateyang/article/details/8860495
0 0
- Unity 委托使用(2)
- Unity委托使用
- unity 事件(委托)
- unity 事件(委托)
- C# 委托/事件在Unity中的使用(续)
- Unity网络请求中委托的使用
- C#委托/事件在Unity中的使用
- unity委托
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之
- unity学习——委托(带参数方法的使用)
- Unity开发中事件和委托的使用
- unity 3d 使用C#的事件/委托机制
- 【Unity】使用C#中的委托类型实现代理设计模式
- Unity中使用委托/事件实现GameObject之间的通信
- 关于Unity中单例调用和委托的使用方式
- unity学习——委托delegate的使用
- 2.10.2Groovy使用委托(@Delegate)
- 详细介绍java中的垃圾回收机制
- 适配器模式
- LeetCode - Reorder List
- Palindrome Partitioning II Java
- JS事件冒泡和事件捕获详解
- Unity 委托使用(2)
- su 用户后,can't open display
- js这些代码你都不会,你还有什么好说的!!!
- oracle自学笔记--flashback特性
- 循环查找并删除文件
- 为自己加油!--从硬件到软件的转型
- java.lang.OutOfMemoryError处理错误
- 几个经典差动放大器应用电路详解
- C语言static关键字解析