文章出處
文章列表
今天無意間讀到大神寫的代碼,看到了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的其他用法,還沒怎么用到,歡迎大家對我提出意見。有錯誤我會直接修改。
今晚繼續學習單例模式。
文章列表
全站熱搜
留言列表