(@WhiteTaken)Unity中Invoke的用法

今天无意间读到大神写的代码,看到了Invoke函数,于是产生兴趣。后来才明白自己要学习的东西还有很多。

下面讲用法。

Invoke是延时调用函数,在用Invoke函数之前需要引入命名空间using UnityEngine.Events;

1.Invoke("MethodName",2)

这个比较简单,写在c#脚本中,意为 两秒之后调用一次,MethodName方法。

2.InvokeRepeating("MethodName",1,2)

这个方法就是多次调用Invoke,即理解为一秒后,每隔两秒调用MethodName方法。

3.CancelInvoke("MethodName")

取消MethodName方法的调用。

直接上代码看更加直观。

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.Events;
 4
 5 public class InvokeTest : MonoBehaviour {
 6     public GameObject Prefabs;
 7     private Vector3 v3;
 8     public int i = 5;
 9     // Use this for initialization
10     void Start () {
11         v3 = new Vector3(0, 0, 0);
12         Invoke("TestIns", 1);
13         //InvokeRepeating("TestIns", 2, 1);      //调用InvokeRepeating时候解开
14     }
15
16     // Update is called once per frame
17     void Update () {
18         if (v3.x == 20) CancelInvoke("TestIns");
19     }
20
21     void TestIns() {                      
22         //v3.x += i;                    //调用InvokeRepeating时候解开
23         Instantiate(Prefabs,v3,Quaternion.identity);
24     }
25
26 }

以上代码,分别是Invoke方法,InvokeRepeating方法,CancelInvoke方法的使用。

Invoke还有一个用法就是可以激活UnityEvent。

下面是例子。

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.Events;
 4
 5 public class TestLoader : MonoBehaviour {
 6     [SerializeField]
 7     protected UnityEvent onLoad = new UnityEvent();
 8     [SerializeField]
 9     protected UnityEvent unLoad = new UnityEvent();
10     // Use this for initialization
11     void Start () {
12         Load();
13         UnLoad();
14     }
15
16     // Update is called once per frame
17     void Update () {
18
19     }
20
21     [ContextMenu("Load")]
22     public void Load() {
23         onLoad.Invoke();
24     }
25
26     [ContextMenu("unLoad")]
27     public void UnLoad() {
28         unLoad.Invoke();
29     }
30 }

这里有两个序列化的UnityEvent,可能看代码不是很直观,直接上图。

      

是不是感觉很眼熟。对就是,像我们经常看到的Button下边的OnClick其实就是这种东西。

我们为这个东西挂上我们自己的测试脚本。

但是这时候我们想要调用测试脚本的方法了,这时候就用到了Invoke。

这里会自动调用UnityEvent下的脚本的指定方法。

测试脚本的代码如下。

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class onLoadScripts1 : MonoBehaviour {
 5     public void systemLoadMessage() {
 6         Debug.Log("=======WhiteTaken=======");
 7     }
 8
 9     public void systemLoadMessage(int i) {
10         Debug.Log("=====WhiteTaken:" + i + "======");
11     }
12 }
13
14 using UnityEngine;
15 using System.Collections;
16
17 public class onLoadScripts2 : MonoBehaviour {
18     public void systemLoadLog() {
19         Debug.Log("--------WhiteTaken----------");
20     }
21 }
22
23 using UnityEngine;
24 using System.Collections;
25
26 public class unLoadScripts : MonoBehaviour {
27     public void systemUnLoad(string name) {
28         Debug.Log("===----+ "+name+"卸载:-----=====");
29     }
30 }

运行以后我们可以看到打印结果。

Invoke的其他用法,还没怎么用到,欢迎大家对我提出意见。有错误我会直接修改。

今晚继续学习单例模式。

时间: 2024-11-04 15:34:36

(@WhiteTaken)Unity中Invoke的用法的相关文章

C#中Invoke的用法

在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫"打开",单击之后按钮上的文本显示"关闭",初学者往往会想当然地这么写: void ButtonOnClick(object sender,EventArgs e) { button.Text="关闭"; } 这样的写法运行程序之后,可能会触发异常,异常信息大致是"不能从不是创建该控件的线程调

C#中Invoke的用法(转)

转自:http://blog.3snews.net/html/30/34530-27563.html 在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示. 正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会. 而所谓的“一面响

C#中Invoke的用法(转)

invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解. 首先说下,invoke和begininvoke的使用有两种情况: 1. control中的invoke.begininvoke. 2. delegrate中的invoke.begininvoke. 这两种情况是不同的,我们这里要讲的是第1种.下面我们在来说下.NET中对invoke和begininvoke的官方定义. contr

Unity 中 ContextMenu 的用法

在自定义脚本中的方法前加入  [ContextMenu("Execute")]  标签,然后将脚本挂载到对象上,可以再编辑模式下执行标记的方法: 自定义脚本如下: using System.Collections; using System.Collections.Generic; using UnityEngine; public class LestContextMenu : MonoBehaviour { [ContextMenu("Execute")] vo

sapi语音朗读的简单用法(Unity中)

运行环境:win10, Unity5.6.2f1/Unity2018.2.6f1(两个版本都试了,可以) using SpeechLib; //... SpVoice voice = new SpVoice(); 书接上文Unity中使用Windows的sapi进行语音朗读上文例子中的代码只是最最简单的使用方法,实际用时是有问题的.这样直接 voice.Speak(str); 如上简单粗暴的使用,会卡住当前Unity程序的主线程,在朗读完毕之前会一直卡,包括关闭Unity程序,也还是会一直读完内

【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在前面两篇文章: [Unity3D基础教程]给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D [Unity3D基础教程]给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation 我们了解

菜鸟学习 - Unity中的热更新 - Lua和C#通信

孙广东 2015-4-6 热更新我是个菜鸟,感谢网上的各位的奉献,这次又当一回搬运工. 准备: 1.了解Lua的语法 推荐书籍<Lua程序设计 第二版> 2.使用ULua插件进行通信 尽量早上真机.因为Bug问题特别多. 大杂烩: 更新LUa其实也是更新资源. Lua被看作一个资源么.Lua代码都是运行时才编译的,不运行的时候就如同一张图片.一段音频一样,都是文件资源:所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现"热更新".运行效率由于使用反射,所以成为它

Unity中对SQL数据库的操作

在Unity中,我们有时候需要连接数据库来达到数据的读取与储存.而在.NET平台下,ADO.NET为我们提供了公开数据访问服务的类.客户端应用程序可以使用ADO.NET来连接到数据源,并查询,添加,删除和更新所包含的数据. 对于ADO.NET,需要了解到Connection,Command,DataReader,DataAdapter,DataSet这几个对象,他们是操作数据库的重要对象.下面简要得介绍下这几个对象的作用以及功能(以SQL为例). 1.Connection:它是建立应用程序与数据

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计算Unity旋转.它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值. Unity内部使用四元数来表示所有的旋转. Quaternion是基于复数,并不容易直观地理解. 不过你几乎不需要访问或修改单个四元数参数(x,y,z,w); 大多数情况下,你只需要获取和使用现有的旋转(例如来自"Transform"),或者用四元数来构造新的旋转(例如,在两次旋转之间平滑插入). 大