今天无意间读到大神写的代码,看到了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,可能看代码不是很直观,直接上图。

(@WhiteTaken)Unity中Invoke的用法-冯金伟博客园      (@WhiteTaken)Unity中Invoke的用法-冯金伟博客园

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

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

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

(@WhiteTaken)Unity中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 }

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

(@WhiteTaken)Unity中Invoke的用法-冯金伟博客园

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

今晚继续学习单例模式。