Unity 延迟执行函数
在 Unity 项目开发中,延迟执行一段代码、一个方法甚至几个方法的情况是普遍存在的。
一般会用到 Invoke 和 InvokeRepeating 方法。
第一个参数为方法名(注意是字符串形式),并不是更方便的委托;
第二个参数是延迟执行的时间;
这个方法只会执行一次。
第一个参数同样为方法名(字符串形式);
第二个参数是延迟多少秒后开始调用;
第三个参数是每次执行的间隔时间。
到这里就会发现,这两个方法都有个弊端,就是必须输入字符串形式的方法名!
也就是说,如果想延迟执行某段代码,必须把代码放在某个方法里,然后使用 Invoke 或者 InvokeRepeating 方法来延迟执行。
这样对于上下文变量、属性的引用就会尤为不便,而且不能传入参数。
也可以利用 StartCoroutine 来执行一个以 IEnumerator 为返回值的方法,但这种方法通常用于异步下载、加载等比较耗时又不能让游戏卡死的情况。
还有一个 WaitForSeconds 类,它是一个构造函数,也适用于延迟执行的情况。
将延迟方法放在一个类里以静态方法的形式存在,就可以在任何时候、任何地方延迟执行指定时间的代码:
1 using System; 2 using System.Collections; 3 using UnityEngine; 4 5 public class DelayTest : MonoBehaviour 6 { 7 public static IEnumerator DelayToInvoke(Action action, float delaySeconds) 8 { 9 yield return new WaitForSeconds(delaySeconds); 10 action(); 11 } 12 }
例如:点击 OnGUI 的按钮去延迟更改界面上的显示文本
1 private string textTestString = "点击开始测试!"; 2 3 void OnGUI() 4 { 5 GUI.BeginGroup(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 50, 300, 300)); 6 GUI.Box(new Rect(0, 0, 200, 200), "测试界面"); 7 GUI.Label(new Rect(60, 50, 150, 30), textTestString); 8 if (GUI.Button(new Rect(50, 120, 100, 30), "开始测试")) 9 { 10 textTestString = "测试延迟中... ..."; 11 StartCoroutine(DelayTest.DelayToInvoke(() => { textTestString = "延迟测试结束!"; }, 1f)); 12 } 13 GUI.EndGroup(); 14 }
textTestString = "延迟测试结束!"; 就是想要延迟执行的代码段。
测试结果:
*** | 以上内容仅为学习参考、学习笔记使用 | ***