内容发布更新时间 : 2024/12/23 3:00:17星期一 下面是文章的全部内容请认真阅读。
关于延迟:Unity 延迟执行一段代码的较为优雅的方式
在Unity中,延时执行一段代码或者一个方法或者几个方法的情况非常普遍。
一般会用到Invoke和InvokeRepeating方法。顾名思义,第一个是执行一次,第二个是重复执行。 看下定义:
void Invoke(string methodName, float time);
第一个参数是方法名(注意是字符串形式),并不是更方便的委托。第二个是延时多少秒。只执行一次。 voidInvokeRepeating(string methodName, float time, float repeatRate);
InvokeRepeating第二个参数是延时多少秒后开始,第三个参数是每次执行间隔的秒数。
你有没有发现这两个方法有个弊端,就是必须输入方法名!也就是我说,如果我想延时执行某段代码,必须把代码放在某个方法里,然后使用这Invoke或者InvokeRepeating方法来执行。
这样对于上下文变量、属性的引用就会尤为不便,而且不能传参数!!!尼玛,要他还有何用? 我猜你一定用过这样的方法。没错,“协同”,听起来还挺高大上的名字啊。
用StartCoroutine来执行一个以IEnumerator为返回值的方法,通常用于异步下载啊,等比较耗时又不能让游戏卡死的情况。
还有一个好的类WaitForSeconds,对,它就一个构造函数,用来延时的(延时??????比万艾可好用?比希爱力好用?)。
好了不废话了,以下是我自用的延时方法,放在一个类里以静态方法存在。可以在任何时候任何地方延时指定秒数的代码。 usingUnityEngine; usingSystem.Collections; using System;
public class DelayToInvoke : MonoBehaviour {
public static IEnumeratorDelayToInvokeDo(Action action, float delaySeconds) {
yield return new WaitForSeconds(delaySeconds); action(); } }
如何使用呢?
比如我点击NGUI的一个Button,则 voidOnClick() {
StartCoroutine(DelayToInvoke.DelayToInvokeDo(() => {
Application.LoadLevel(“Option”); }, 0.1f)); }
看到了吧
Application.LoadLevel(“Option”);就是想要延时执行的代码段。 你可以写很长很长。Action,随便搞。
iTween的使用
移动模型时候用到的几个核心方法如下:
iTween.MoveTo():让模型移动到一个位置,它的底层函数是通过动态的修改模型每一帧的transform.position完成的,所以它会百分之百到达目标点,不会出现误差。
iTween.MoveFrom():它和上面的一样,iTween.MoveTo()是将模型移动到目标位置,而iTween.MoveFrom()是将模型从目标位置移动到原始位置。
iTween.MoveAdd() 和iTween.MoveBy()底层实现一样,大家可以去看源码。处理移动时采用的是transform.Translate也就是API的平移,这样在处理移动的时候可能会出现一些误差,但是效果好点。
iTween.MoveUpdate():和iTween.MoveTo()差不多,只是它需要放在循环或者Update()中。
有了核心的移动方法后,我们就来了解iTween强大的核心参数,与事件。移动方法的参数都差不多,所以这里我就以MoveTo来做例子。直接上代码。 Move.cs绑定在需要移动的游戏对象身上。
1 using UnityEngine; 2 using System.Collections; 3
4 public class Move : MonoBehaviour 5 { 6 7 8 9 10 11 12
//键值对儿的形式保存iTween所用到的参数 Hashtableargs = new Hashtable(); void Start() {
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
//这里是设置类型,iTween的类型又很多种,在源码中的枚举EaseType中 //例如移动的特效,先震动在移动、先后退在移动、先加速在变速、等等 args.Add(\//移动的速度, args.Add(\
//移动的整体时间。如果与speed共存那么优先speed args.Add(\
//这个是处理颜色的。可以看源码的那个枚举。 args.Add(\//延迟执行时间 args.Add(\//移动的过程中面朝一个点 args.Add(\
//三个循环类型 none loop pingPong (一般循环来回) //args.Add(\//args.Add(\ args.Add(\//处理移动过程中的事件。
//开始发生移动时调用AnimationStart方法,5.0表示它的参数 args.Add(\args.Add(\
//设置接受方法的对象,默认是自身接受,这里也可以改成别的对象接受, //那么就得在接收对象的脚本中实现AnimationStart方法。 args.Add(\//移动结束时调用,参数和上面类似 args.Add(\args.Add(\args.Add(\//移动中调用,参数和上面类似 args.Add(\args.Add(\args.Add(\// x y z 标示移动的位置。 args.Add(\args.Add(\args.Add(\