事件/委托机制(event/delegate)(Unity3D开发之十七)
猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://blog.csdn.net/cocos2der/article/details/46539433
Delegate作用我就不多说了,Unity中可以直接使用EventHandler实现事件委托,咱们直接事例吧。
一、场景物体移动结束后事件监听
假如PlayerControl,移动结束后触发MoveComplete事件。
using UnityEngine;
using System.Collections;
using System;
public class PlayerControl : MonoBehaviour {
public event EventHandler MoveComplete;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonUp(0)) {
// Test logic for PlayerMoveComplete
PlayerMoveComplete();
}
}
void PlayerMoveComplete()
{
if (MoveComplete != null) {
MoveComplete(this, EventArgs.Empty);
}
}
}
事件接收处理
using UnityEngine;
using System.Collections;
using System;
public class GameManager : MonoBehaviour {
public static GameManager Instance;
public PlayerControl playerControl;
void Awake ()
{
// check there isn't more than one instance of the GameManager in the scene
if(Instance != null){
Debug.LogError("More than one GameManager found in the scene");
return;
}
// set the global instance
Instance = this;
}
// Use this for initialization
void Start () {
playerControl.MoveComplete += HandleMoveComplete;
}
void HandleMoveComplete (object sender, EventArgs e)
{
Debug.Log("MoveComplete:");
}
// Update is called once per frame
void Update () {
}
}
这里由于使用的EventHandler实现,所以在事件中无法传递自定义参数。
二、自定义Event,事件中传递自定义参数
1、自定义EventArgs
using UnityEngine;
using System.Collections;
using System;
public class PlayerMoveEventArgs : EventArgs {
private string message;
public PlayerMoveEventArgs(string message)
{
this.message = message;
}
public string Message
{
get{return message;}
}
}
public delegate void MoveCompleteHandle(object sender, PlayerMoveEventArgs e);
那么我们修改下PlayerControl
using UnityEngine;
using System.Collections;
using System;
public class PlayerControl : MonoBehaviour {
public event EventHandler MoveComplete;
public event MoveCompleteHandle CustomMoveComplete;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonUp(0)) {
// Test logic for PlayerMoveComplete
PlayerMoveComplete();
}
}
void PlayerMoveComplete()
{
if (MoveComplete != null) {
MoveComplete(this, EventArgs.Empty);
}
if (CustomMoveComplete != null) {
CustomMoveComplete(this, new PlayerMoveEventArgs("Move:" + this.name));
}
}
}
处理事件的我们也修改下
using UnityEngine;
using System.Collections;
using System;
public class GameManager : MonoBehaviour {
public static GameManager Instance;
public PlayerControl playerControl;
void Awake ()
{
// check there isn't more than one instance of the GameManager in the scene
if(Instance != null){
Debug.LogError("More than one GameManager found in the scene");
return;
}
// set the global instance
Instance = this;
}
// Use this for initialization
void Start () {
playerControl.MoveComplete += HandleMoveComplete;
playerControl.CustomMoveComplete += HandleCustomMoveComplete;
}
void HandleCustomMoveComplete (object sender, PlayerMoveEventArgs e)
{
Debug.Log("HandleCustomMoveComplete:" + e.Message);
}
void HandleMoveComplete (object sender, EventArgs e)
{
Debug.Log("MoveComplete:");
}
// Update is called once per frame
void Update () {
}
}
ok,现在你可以自由的玩耍了。
事件/委托机制(event/delegate)(Unity3D开发之十七)的更多相关文章
- 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 一对多的观察者模式机制有什么缺点? 想要查看 ...
- C++模拟C#事件委托机制(一)
原文来自于http://www.cnblogs.com/netssfy/articles/1652671.html 写了一段时间的C#代码后确实发现C#的事件委托非常好用.于是便想是否在C++中也能如 ...
- Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制
一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...
- JavaScript 之默认行为 DOM2级,事件委托机制
1. 事件默认行为及阻止方式 1.1 浏览器的默认行为 JavaScript事件本身所具有的属性,例如a标签的跳转,Submit按钮的提交,右键菜单,文本框的输入等. 1.2 ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 事件循环机制(event loop)
JavaScript 事件循环机制 (event loop) 本篇文章已经默认你有了基础的 ES6 和 javascript语法 知识. 本篇文章比较细致,如果已经对同步异步,单线程等概念比较熟悉的读 ...
- 转载: jQuery事件委托( bind() \ live() \ delegate()) [委托 和 绑定的故事]
转载:http://blog.csdn.net/zc2087/article/details/7287429 随着DOM结构的复杂化和Ajax等动态脚本技术的运用,事件委托自然浮出了水面.jQuery ...
- javascript事件委托机制详解
以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点 ...
- JS与Jquery的事件委托机制
传送:http://www.ituring.com.cn/article/467 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委 ...
- js的事件委托机制
如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们的父 ...
随机推荐
- Java异常封装(自己定义错误码和描述,附源码)
真正工作了才发现,Java里面的异常在真正工作中使用还是十分普遍的.什么时候该抛出什么异常,这个是必须知道的. 当然真正工作里面主动抛出的异常都是经过分装过的,自己可以定义错误码和异常描述. 下面小宝 ...
- EBS业务学习之库存管理
库存管理业务流程 企业结构 库存结构 库存结构定义 指定每个子库存的特性: •子库存的数量跟踪 •资产类子库存 •保留子库存 •净值子库存 •包含在有效承诺中Include in ATP •子库存级库 ...
- OpenCV, MatBGR2ARGB, ARGB2MatBGR
代码片段~ unsigned int* abMatBGR2ARGB(Mat imag) { int nCols; int nRows; unsigned int *pbuff = NULL; if(i ...
- 20ViewPager demo1,2:接收ViewPager展示View的使用
Demo1 MainActivity .JAVA package com.qf.day20_viewpager_demo1; import java.util.ArrayList; import ja ...
- 深入浅出seesion和cookie
session在计算机中,尤其是在网络应用中,称为"会话控制".session 对象存储特定用户会话所需的属性及配置信息.session跟踪是Web程序中常用的技术,用来跟踪用户的 ...
- FFmpeg源代码简单分析:avformat_find_stream_info()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 剑指Offer——贪心算法
剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...
- java中hashCode()与equals()详解
首先之所以会将hashCode()与equals()放到一起是因为它们具备一个相同的作用:用来比较某个东西.其中hashCode()主要是用在hash表中提高 查找效率,而equals()则相对而言使 ...
- JAVA代码规范笔记(下)
声明 17.推荐一行一个声明,因为这样有利于写注释.换句话说,下面的声明方法中, int level; // indentation level int size; // size of table ...
- Java-IO之总框架
在Java IO中我们会经常提到输入流和输出流,流是一种抽象的数据总称,本质是能够进行数据的传输.按照流的方向分为:输入流和输出流.按照流中处理数据的单位,可以将其区分为:字节流和字符流.在Java中 ...