U3D C# 实现AS3事件机制
写了很多年的AS3,最近接触U3D感觉事件机制没AS3的爽。咬紧牙关一鼓作气 基于C# 的委托实现了一版。废话不多说上干货。
EventDispatcher代码如下:
using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
/**
* EventDispatcher 类是可调度事件的所有类的基类
* @author 回眸笑苍生
**/
public abstract class EventDispatcher : MonoBehaviour
{
//定义委托
public delegate void EventDelegate(EventObject evt);
protected Dictionary<String,List<EventDelegate>> captureListeners = null;
protected Dictionary<String,List<EventDelegate>> bubbleListeners = null;
protected EventDispatcher _parent;
public void addEventListener(String types, EventDelegate listener, bool useCapture = false, int priority = 0, bool useWeakReference=false)
{
Dictionary<String,List<EventDelegate>> listeners = null;
if (listener == null)
{
throw new ArgumentNullException("Parameter listener must be non-null.");
}
if (useCapture)
{
if (captureListeners == null) captureListeners = new Dictionary<string, List<EventDelegate>>();
listeners = captureListeners;
}
else
{
if (bubbleListeners == null) bubbleListeners = new Dictionary<string, List<EventDelegate>>();
listeners = bubbleListeners;
}
List<EventDelegate> vector = null;
if (listeners.ContainsKey (types))
{
vector = listeners[types];
}
if (vector == null)
{
vector = new List<EventDelegate>();
listeners.Add(types, vector);
}
if (vector.IndexOf(listener) < 0)
{
vector.Add(listener);
}
}
public void removeEventListener(String types, EventDelegate listener, bool useCapture = false)
{
if (listener == null)
{
throw new ArgumentNullException("Parameter listener must be non-null.");
}
Dictionary<string, List<EventDelegate>> listeners = useCapture ? captureListeners : bubbleListeners;
if (listeners != null)
{
List<EventDelegate> vector = listeners [types];
if (vector != null)
{
int i = vector.IndexOf(listener);
if (i >= 0)
{
int length = vector.Count;
for(int j = i+1;j < length;j++,i++)
{
vector[i] = vector[j];
}
listeners.Remove(types);
foreach (KeyValuePair<String, List<EventDelegate>> o in listeners)
{
if(o.Key == null)
{
if (listeners == captureListeners)
{
captureListeners = null;
}
else
{
bubbleListeners = null;
}
}
}
}
}
}
}
public bool hasEventListener(String types)
{
return (captureListeners != null && captureListeners.ContainsKey(types)) || (bubbleListeners != null && bubbleListeners.ContainsKey(types));
}
public bool willTrigger(String types)
{
for (EventDispatcher _object = this; _object != null; _object = _object._parent)
{
if ((_object.captureListeners != null && _object.captureListeners.ContainsKey(types)) ||( _object.bubbleListeners != null && _object.bubbleListeners.ContainsKey(types)))
return true;
}
return false;
}
public bool dispatchEvent(EventObject evt)
{
if (evt == null)
{
throw new ArgumentNullException("Parameter EventObject must be non-null.");
}
EventObject event3D = evt;
if (event3D != null)
{
event3D.setTarget = this;
}
List<EventDispatcher> branch = new List<EventDispatcher> ();
int branchLength = 0;
EventDispatcher _object;
int i, j = 0;
int length;
List<EventDelegate> vector;
List<EventDelegate> functions;
for (_object = this; _object !=null; _object=_object._parent)
{
branch.Add(_object);
branchLength++;
}
for (i = branchLength - 1; i > 0; i--)
{
_object = branch[i];
if (event3D != null)
{
event3D.setCurrentTarget = _object;
event3D.setEventPhase = EventPhase.CAPTURING_PHASE;
}
if (_object.captureListeners != null)
{
vector = _object.captureListeners[evt.types];
if (vector != null)
{
length = vector.Count;
functions = new List<EventDelegate>();
for (j = 0; j < length; j++) functions[j] = vector[j];
for (j = 0; j < length; j++) (functions[j] as EventDelegate)(evt);
}
}
}
if (event3D != null)
{
event3D.setEventPhase = EventPhase.AT_TARGET;
}
for (i = 0; i < branchLength; i++) {
_object = branch[i];
if (event3D != null) {
event3D.setCurrentTarget = _object;
if (i > 0) {
event3D.setEventPhase = EventPhase.BUBBLING_PHASE;
}
}
if (_object.bubbleListeners != null) {
vector = _object.bubbleListeners[evt.types];
if (vector != null) {
length = vector.Count;
functions = new List<EventDelegate>();
for (j = 0; j < length; j++) functions.Add(vector[j]);
for (j = 0; j < length; j++) (functions[j] as EventDelegate)(evt);
}
}
if (!event3D.bubbles) break;
}
return true;
}
}
EventPhase代码如下:
using UnityEngine;
using System.Collections;
/**
* EventPhase 类可为 Event 类的 eventPhase 属性提供值。
* @author 回眸笑苍生
**/
public class EventPhase
{
public const int CAPTURING_PHASE = 1;
public const int AT_TARGET = 2;
public const int BUBBLING_PHASE = 3;
}
EventObject代码如下:
using UnityEngine;
using System.Collections;
using System;
/**
* EventObject 类作为创建 Event 对象的基类,当发生事件时,Event 对象将作为参数传递给事件侦听器。
* @author 回眸笑苍生
**/
public class EventObject
{
public const String ACTIVATE = "activate";
public const String ADDED = "added";
public const String ADDED_TO_STAGE = "addedToStage";
public const String CANCEL = "cancel";
public const String CHANGE = "change";
public const String CLEAR = "clear";
public const String CLOSE = "close";
public const String CLOSING = "closing";
public const String COMPLETE = "complete";
public const String CONNECT = "connect";
public const String OPEN = "open";
private EventDispatcher _target;
private int _eventPhase;
private EventDispatcher _currentTarget;
private bool _bubbles;
private bool _cancelable;
private String _types;
public EventObject(String types, bool bubbles=false, bool cancelable=false)
{
this._types = types;
this._bubbles= bubbles;
this._cancelable = cancelable;
}
public EventDispatcher target
{
get { return _target; }
}
internal EventDispatcher setTarget
{
set { _target = value; }
}
public EventDispatcher currentTarget
{
get { return _currentTarget; }
}
internal EventDispatcher setCurrentTarget
{
set { _currentTarget = value; }
}
public int eventPhase
{
get { return _eventPhase; }
}
internal int setEventPhase
{
set { _eventPhase = value; }
}
public bool bubbles
{
get { return _bubbles; }
}
public String types
{
get { return _types; }
}
public bool cancelable
{
get { return _cancelable; }
}
}
在使用过程中 大家可以把 U3D中新建Class 默认继承的基类 换成 EventDispatcher 这样一来就拥有了和AS3一样的 事件机制了。
有什么Bug 欢迎大家多多指教。
U3D C# 实现AS3事件机制的更多相关文章
- AS3事件机制概述
事件机制是AS3的核心功能之一,没有充分掌握事件机制的方方面面,就不能算是精通AS3语言. 1. AS3事件机制的主要成员 IEventDispatcher:事件派发对象接口,定义了添加.派发.移除. ...
- [转]as3事件流机制彻底理解
题记: 看过网上一些as3事件流的教程,觉得大多都讲得不甚清楚,让人不能直观的理解事件流.而这篇教程以将事件流过程比喻成捕鱼过程,形象简单. 在此基础上对于as3事件流总算有了全面的理解.事件流机制说 ...
- (转载)AS3.0实例学习 熟悉新的事件机制和addChild的运用
(转载)http://www.jb51.net/article/13139.htm 首先声明:本人大菜鸟一个,刚接触AS3不久,许多理念还没来得及灌输,这些case都是从网上down的,但因为解说是英 ...
- Aa3.0 事件机制
说明:本文由多处网络文章整理而成,在此未一一注明原文链接,敬请谅解! AS3:事件流机制 事件流 只要发生事件,Flash Player就会调度该事件对象. 如果事件目标不在显示列表中,则Flash ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
- tkinter事件机制
一.tkinter.Event tkinter的事件机制跟js是一样的,也是只有一个Event类,这个类包罗万象,集成了键盘事件,鼠标事件,包含各种参数. 不像java swing那种强类型事件,sw ...
- [解惑]JavaScript事件机制
群里童鞋问到关于事件传播的一个问题:“事件捕获的时候,阻止冒泡,事件到达目标之后,还会冒泡吗?”. 初学 JS 的童鞋经常会有诸多疑问,我在很多 QQ 群也混了好几年了,耳濡目染也也收获了不少,以后会 ...
- Atitit 数据库的事件机制--触发器与定时任务attilax总结
Atitit 数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...
- 深入浅出iOS事件机制
原文地址: http://zhoon.github.io/ios/2015/04/12/ios-event.html 本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出. iO ...
随机推荐
- hibernate面试笔记
Hibernate使用Java 反射机制 而不是字节码增强程序来实现透明性 如果JDBC代码写的完美,优化做好,那么JDBC效率是最高的.但是,实际开发中非常不现实,对程序员要求太高.一般情况下,hi ...
- win8 + ubuntu14.04 安装步骤
一.首先,从硬盘上划分一个空闲分区(推荐最少20G,每个人也可以按照自己的需要自行设定).记住各个分区的容量,方便安装时辨认.并从Ubuntu官方网站上下载Ubuntu 14.04 LTS 光盘镜像. ...
- 哈希表(hashtable)的javascript简单实现
javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...
- Python【第一篇】基础介绍
一.本节主要内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc文件 数据类型初识 数据运算 表达式if ...else语 ...
- about python
函数式编程 λ演算 LISP,Erlang 尾递归 栈的使用 避免防御式编程 ER实体Entity关系relationship OOP [OOA/D] 属性.行为 继承.聚合.关联 抽象.封装 笛卡尔 ...
- 【转】深入 char * ,char ** ,char a[ ] ,char *a[] 内核
原文出处:http://blog.csdn.net/daiyutage/article/details/8604720 C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了 ...
- 在oj平台上练习的一些总结【转】
程序书写过程中的一些小技巧:1. freopen(“1.txt”,”r”,stdin); //程序运行后系统自动输入此文档里面的内容(不需要进行手动输入)freopen(“1.txt”,”w”,std ...
- 常用webservice接口案例
商业和贸易: 1.股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebSe ...
- JSP中使用的模式——JSP+Servlet+JavaBean
上一篇博文写到模式一:JSP+JavaBean 链接地址:http://wxmimperio.coding.io/?p=155 JSP中两种模式的总结 链接地址:http://wxmimperio.c ...
- UFLDL教程(四)之Softmax回归
关于Andrew Ng的machine learning课程中,有一章专门讲解逻辑回归(Logistic回归),具体课程笔记见另一篇文章. 下面,对Logistic回归做一个简单的小结: 给定一个待分 ...