关于unity延迟执行网上也有很多了,我这里只是封装下,让写代码变得更加优雅,使用更加方便。
一个问题想要表述清楚,读者也能看明白,无非3个点:What(要说的是什么),How(怎么用你这个东西?什么情况下有用?),Why(为什么要这么做,这么做有啥好处?我不这么用可以不可以?等等)
首先来看 what,直接上代码了
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class StaticUtils
{
public static Coroutine DelayToDo(this MonoBehaviour mono, float delayTime, Action action, bool ignoreTimeScale = false)
{
Coroutine coroutine = null;
if (ignoreTimeScale)
{
coroutine = mono.StartCoroutine(DelayIgnoreTimeToDo(delayTime, action));
}
else
{
coroutine = mono.StartCoroutine(DelayToInvokeDo(delayTime, action));
}
return coroutine;
}
public static IEnumerator DelayToInvokeDo(float delaySeconds, Action action)
{
yield return new WaitForSeconds(delaySeconds);
action();
}
public static IEnumerator DelayIgnoreTimeToDo(float delaySeconds, Action action)
{
float start = Time.realtimeSinceStartup;
while (Time.realtimeSinceStartup < start + delaySeconds)
{
yield return null;
}
action();
}
public static bool IsNullOrEntry(this string str)
{
return String.IsNullOrEmpty(str);
}
}
代码也有注释,应该很清楚了,,,这里要创建一个static的类,这样的类也算是一个工程中必要的工具类了吧,可以添加自己的扩展工具方法,使自己的代码写的更加流畅,,,嗯,(代码最后送大家一个函数,怎么用呢?平时我们判断一个字符串是null还是“”,怎么判断的呢,每次都要string.IsNullOrEmpty(str),巨麻烦,现在你只用str.IsNullOrEmpty(),代码书写起来流畅无打断,是不是很安逸)
好吧,回归正题,如何用(How)?
用就很简单了,在继承了MonoBehaviour的脚本方法里,直接:
this.DelayToDo(1.0f, () =>
{
//要搞的事情
});
有哪些使用的场景(情况)的呢?
如要等一个特效完了,才显示界面等,反正就是各种等待都行。
这里DelayToDo返回了Coroutine ,所以要停止携程也很简单 调用StopCoroutine(coroutine ),传入刚的返回就行了。因为使用的是协程,所以他的生命周期和所挂脚本的gameobjtect是一致的,如果销毁或隐藏了gameobject,该延迟就会停止执行。
如果要使用全局的(无论一个界面还是物体被销毁或隐藏了该延时执行都要继续进行下去)的话,你可以建一个一直的存在的物体挂一个脚本,用这个脚本去调用上面DelayToDo。还有一种方便的方式是,如果你的项目中使用Dotween的话,可以使用:
DOVirtual.DelayedCall(1.0f, () =>
{
//要搞的事情
});
最后,来说各种Why,
这么做有啥好处?
好处是,写代码方便,提高效率,延迟执行一句代码搞定,能使用 . 的就使用 . 。这样代码看起来也简洁很多。
我不这么做行不行?我有更好的方法?
可以,当然可以。。那个,如果你有好的方法方式,还请留言给出,大家一起交流。