猴子原创,欢迎转载。转载请注明: 转载自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开发之十七)的更多相关文章

  1. 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 一对多的观察者模式机制有什么缺点? 想要查看 ...

  2. C++模拟C#事件委托机制(一)

    原文来自于http://www.cnblogs.com/netssfy/articles/1652671.html 写了一段时间的C#代码后确实发现C#的事件委托非常好用.于是便想是否在C++中也能如 ...

  3. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

  4. JavaScript 之默认行为 DOM2级,事件委托机制

    1. 事件默认行为及阻止方式    1.1 浏览器的默认行为       JavaScript事件本身所具有的属性,例如a标签的跳转,Submit按钮的提交,右键菜单,文本框的输入等.    1.2 ...

  5. 一篇文章图文并茂地带你轻松学完 JavaScript 事件循环机制(event loop)

    JavaScript 事件循环机制 (event loop) 本篇文章已经默认你有了基础的 ES6 和 javascript语法 知识. 本篇文章比较细致,如果已经对同步异步,单线程等概念比较熟悉的读 ...

  6. 转载: jQuery事件委托( bind() \ live() \ delegate()) [委托 和 绑定的故事]

    转载:http://blog.csdn.net/zc2087/article/details/7287429 随着DOM结构的复杂化和Ajax等动态脚本技术的运用,事件委托自然浮出了水面.jQuery ...

  7. javascript事件委托机制详解

    以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点 ...

  8. JS与Jquery的事件委托机制

    传送:http://www.ituring.com.cn/article/467 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委 ...

  9. js的事件委托机制

    如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们的父 ...

随机推荐

  1. 高性能的Redis代理TwemProxy

    TwemProxy是一个Redis的中间件代理,具有很多有用的功能,可以暂时替代一部分Redis Cluster的功能: ²  支持和6479.之后相应地,配置好两个Redis实例并启动.现在就可以启 ...

  2. SQL Server 索引维护(1)——如何获取索引使用情况

    前言: 在前面一文中,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理: 对于索引不足的情况:检查缺少索引的 ...

  3. 字符编码(ASCII、ANSI、GB2312、UTF-8等)系统梳理

    引言 在显示器上看见的文字.图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大,会看见盘片表面凹凸不 ...

  4. Python中使用rrdtool结合Django进行带宽监控

    我们有个网关需要做下带宽监控,能获取这个数据的唯一方法就是登录到管理界面查看.然后咱就写了个模拟登录的爬虫,定时抓取数据用rrdtool存储,最后通过Django来展示.这里就涉及了python的rr ...

  5. 皮尔森相似度计算举例(R语言)

    整理了一下最近对协同过滤推荐算法中的皮尔森相似度计算,顺带学习了下R语言的简单使用,也复习了概率统计知识. 一.概率论和统计学概念复习 1)期望值(Expected Value) 因为这里每个数都是等 ...

  6. Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte

    File 类 用来将文件或者文件夹封装成对象 方便对文件与文件夹进行操作. File对象可以作为参数传递给流的构造函数 流只用操作数据,而封装数据的文件只能用File类 File类常见方法: 1.创建 ...

  7. Android简易实战教程--第四话《最简单的短信发送器》

    首先配置一个布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  8. (NO.00005)iOS实现炸弹人游戏(六):游戏数据的初始化(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在我们来看看实际初始化地图的randomCreateMap方法 ...

  9. Docker教程:dokcer machine的概念和安装

    http://blog.csdn.net/pipisorry/article/details/50920982 Docker machine介绍 做为Docker容器集群管理三剑客之一的Docker ...

  10. UNIX网络编程——TCP长连接与短连接的区别

    一.TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server发送消息,server回应client,然后 ...