一、Invoke定时器

有3种定时器,这里我们讲Invoke

1.创建一个Canvas

2.对Canvas进行初始化

3.创建一个Image的UI节点作为Canvas的子节点,名字叫bg,拖进背景图片到这个节点中。

4.创建一个game_scene的脚本挂载到Canvas下面

5.game_scene脚本内容:

void Start () {
// 5秒后调用一下我们的函数,只会调用一次
this.Invoke("onTimer", 5.0f);
// end // 每隔多少秒循环触发一次
// time 多少时间以后,开始调用;
// repeatRate每隔多少秒调用一次
// 5秒以后开始,每隔0.5秒调用一次
this.InvokeRepeating("onTimer", , 0.5f);
// end // 定时器,是不支持参数传递的;
this.Invoke("cancel_timer", 10f);
}
void cancel_timer() {
// 取消以后,就再也不会调用这个timer了。
this.CancelInvoke("onTimer");
} void onTimer() {
Debug.Log("onTimer called");
}

二、委托

委托就是有一些人对A事件感兴趣,这时候出现了一个订阅中心,只要这些人订阅了这个订阅中心,一旦事件发生了,只要通知这个订阅中心,不用管有多少人对这个事件感兴趣,都由订阅中心通知给每一个订阅者,这些人就各自响应A事件。

这个订阅中心叫做委托。好处就是不用管有多少人对某事件感兴趣,都是统一通知的。

对于发出事件的对象,不用管有多少个人在监听自己,只要把事件丢给委托就好了,而对于监听者,不用管事件发出者是哪个对象,只要自己感兴趣的事件发生了,就去响应一些操作。

监听者:设置一个函数,告诉委托,有事件触发了,请你调用这个设置的函数。

委托者:事件触发了,告诉委托,委托调用监听这个事件的监听者设置的函数。

步骤:

1.定义委托的类型

 // 定义一个委托类型, 那么它的回掉的参数,string str, 函数;
// 定义了监听事件的人,设置事件发生时的回掉函数的类型;
public delegate void EventHandler(string name, int age);

2.创建一个委托实例的引用和实例化

  // 定义一个委托引用;
// event 修饰的委托,就只能是它的成员函数里面触发,不能在其他组件实例触发;
public event EventHandler e;
void Start () {
// 定时器,是不支持参数传递的;
this.Invoke("cancel_timer", 10.0f); this.e = new EventHandler(this.on_event_trigged);
}

3.监听者

   // 监听者
void on_event_trigged(string name, int age) {
Debug.Log("on_event_trigged" + name + age);
}

4.触发者

    // 触发者
void cancel_timer() {// event修饰,强制要求委托只能是内部触发
this.e("blake", );
}

三、委托的赋值、加法、移除、追加步骤

1.定义委托的类型

    // 定义一个委托类型, 那么它的回掉的参数,string str, 函数;
// 定义了监听事件的人,设置事件发生时的回掉函数的类型;
public delegate void EventHandler(string name, int age);

2.创建一个委托实例的引用和实例化

// 定义一个委托引用;
// event 修饰的委托,就只能是它的成员函数里面触发;
public event EventHandler e; void Start () {
// 定时器,是不支持参数传递的;
this.Invoke("cancel_timer", 5.5f); this.e = new EventHandler(this.on_event_trigged); EventHandler e1 = new EventHandler(this.on_event_trigged1);
EventHandler e2 = new EventHandler(this.on_event_trigged2);
     
  
     //会覆盖之前的只有一个监听者的时候,会响应on_event_trigged1和on_event_trigged2
     //this.e = e1 + e2;      //追加,会响应on_event_trigged1和on_event_trigged2和on_event_trigged
   this.e += (e1 + e2); //Debug.Log("game scene start!!!");
// 隐士的创建了一个委托对象
//this.e += this.on_event_trigged;
//this.e += this.on_event_trigged1;
//this.e += this.on_event_trigged2;      //移除
//this.e -= this.on_event_trigged2;
}

3.监听者

    // 监听者1
void on_event_trigged1(string name, int age)
{
Debug.Log("on_event_trigged1" + name + age);
} // 监听者2
void on_event_trigged2(string name, int age)
{
Debug.Log("on_event_trigged2" + name + age);
} // 监听者3
void on_event_trigged(string name, int age) {
Debug.Log("on_event_trigged" + name + age);
}

 

4.触发者

    // 触发者
void cancel_timer() {// event修饰,强制要求委托只能是内部触发
this.e("blake", );
}

四、委托在父节点中,监听者和响应函数在子节点中

1.game_scene脚本中定义委托的类型

    // 定义一个委托类型, 那么它的回掉的参数,string str, 函数;
// 定义了监听事件的人,设置事件发生时的回掉函数的类型;
public delegate void EventHandler(string name, int age);

2.game_scene脚本中创建一个委托实例的引用

    // 定义一个委托引用;
// event 修饰的委托,就只能是它的成员函数里面触发;
public event EventHandler e;

3.Canvas的子节点item下挂载一个叫做item的脚本,item脚本里面的监听者:

public class item : MonoBehaviour {
game_scene scene;
// Use this for initialization void Start () {
Debug.Log("item start");
// 监听game_scene里面的事件;
this.scene = this.transform.parent.GetComponent<game_scene>();
this.scene.e += this.on_item_event_called; } void on_item_event_called(string name, int age) {
Debug.Log("on_item_event_called: " + name + " " + age);
}
}

4.触发者方法1,在父节点canvas的game_scene组件脚本里面的触发者触发委托

   void Start () {
// 定时器,是不支持参数传递的;
this.Invoke("cancel_timer", 5.5f);
   }   // 触发者
void cancel_timer() {// event修饰,强制要求委托只能是内部触发
this.e("blake", );
}

5.触发者方法2,在子节点item的item组件脚本里面的触发者触发委托

game_scene:

    // 定义一个委托引用;
// 这里不能用event修饰,因为是在别的节点的组件实例里触发
public EventHandler e;

item:

void Start () {
Debug.Log("item start");
// 监听game_scene里面的事件;
this.scene = this.transform.parent.GetComponent<game_scene>();
this.scene.e += this.on_item_event_called; //触发语句
this.Invoke("on_trigger", );
} void on_trigger() {
// 如果是event修饰的委托,只能内部触发。
this.scene.e("haha", );
}

注意:

1.可以把委托赋值为空

this.e=null;

2.一般把监听者注册到委托对象中是用

this.e+=this.on_event_trigged;

 

3.Unity有帮我们分装了一种委托类型的写法,叫系统封装的委托类

(1)方法1的定义

public delegate void EventHandler(string name, int age);

(2)方法2的定义---封装好的,F12进去其实就是方法1

  public event Action<int> action = null;
  public event Action<int, string, int, int> action2;

方法2的添加

    void Start () {
// 定时器,是不支持参数传递的;
this.Invoke("cancel_timer", 5.5f);    this.action += this.on_action_called;
}

方法2的响应

 void on_action_called(int num) {
Debug.Log("num = " + num);
}

方法2的触发

    // 触发者
void cancel_timer() {
if (this.action != null) {
this.action();
}
}

关于Unity中的定时器和委托的更多相关文章

  1. Unity中的定时器与延时器

    JavaScript中的定时器与延时器,分别是 setInterval.setTimeout,对应的清理函数是:clearInterval.clearTimeout. 而在Unity中,则分别是:In ...

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

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

  3. Unity中利用委托与监听解耦合的思路

    这篇随笔是一篇记录性的随笔,记录了从http://www.sikiedu.com/my/course/304,这门课程中学到的内容,附带了一些自己的思考. 一.单例模式的应用 首先假想一种情况,现在需 ...

  4. Unity 中 使用c#线程

    使用条件   天下没有免费的午餐,在我使用unity的那一刻,我就感觉到不自在,因为开源所以不知道底层实现,如果只是简单的做点简单游戏,那就无所谓的了,但真正用到实际地方的时候,就会发现一个挨着一个坑 ...

  5. 【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    作者:Williammao, 腾讯移动客户端开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/290.h ...

  6. 从Unity中的Attribute到AOP(四)

    本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...

  7. 从Unity中的Attribute到AOP(三)

    上一篇我们对系统的Attributes进行了MSIL代码的查看,了解到了其本质就是一个类的构造函数.本章我们将编写自己的Attributes. 首先我们定义书的属性代码,如下: [AttributeU ...

  8. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...

  9. 【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

    引言 原则1尽可能地使用属性而不是可直接访问的数据成员 原则2偏向于使用运行时常量而不是编译时常量 原则3 推荐使用is 或as操作符而不是强制类型转换 原则4 推荐使用条件属性而不是if条件编译 原 ...

随机推荐

  1. Linux内核同步 - Seqlock

    一.前言 普通的spin lock对待reader和writer是一视同仁,RW spin lock给reader赋予了更高的优先级,那么有没有让writer优先的锁的机制呢?答案就是seqlock. ...

  2. bug list

    机型: Samsung Galaxy S GT-I9000 版本: 2.2.1bug: Couldn't create directory for SharedPreferences file xxx ...

  3. 模拟HTTP请求获取返回值

    package org.jeecgframework.core.util; import java.io.BufferedReader; import java.io.IOException; imp ...

  4. MATLAB(4)——图片保存方法汇总及常用指令

    作者:桂. 时间:2017-03-03  19:30:03 链接:http://www.cnblogs.com/xingshansi/p/6498318.html 前言 本文为MATLAB系列第四篇. ...

  5. Oracle学习笔记之七(用户管理、角色与权限、导入导出等)

    下面这些基本的SQL语句应该熟悉,能够灵活运用.最好在不查资料的情况下,能够写出如下的任何代码. 1. 用户操作 --create user username identified by passwo ...

  6. openvpn上查看谁在连接服务端

    在服务端/etc/openvpn目录里面有ipp.txt和openvpn-status.log,这两个文件里面记录了,访问服务器的ip网段和地址.但是这两个文件也不是专门干这个用的,也算是一种另类的用 ...

  7. php利用phpexcel导出数据

    php中利用phpexcel导出数据的实现代码.对phpexcel类库不熟悉的朋友,可以阅读下<phpexcel中文帮助手册>中的内容,具体实例大家可以phpexcel快速开发指南中的相关 ...

  8. [svc]mousedos网络批量部署xp

    小时候对这个东西很好奇,不知道什么原理.一直觉得很好玩.现在研究了下,总结如下 软件的操作步骤很讲究,稍微不慎,则就需要重新来过 知识点: 1,掌握诺顿ghost分区为gh文件 2,学会清理至一个干净 ...

  9. 【Linux】 无密码SCP在Crontab中失效的解决办法

    一.缘由: 之前由于服务器只能密钥登陆,并限制root账户登陆,故用SSH打通了所有服务器,实现了公钥转发scp免输密码等,极大方便了服务器的管理. 最近有个需求,是做数据的异地备份.最简单的用scp ...

  10. ny220 推桌子

    推桌子 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 The famous ACM (Advanced Computer Maker) Company has rent ...