Unity中在Editor下的延迟调用
说到延迟调用, 大家肯定首先想到的是MonoBehavior的协程, 但是在Editor不太好用. 我们这里给出两个方案供大家选择.
async
第一种比较简单, 利用C#的特性, 需要c# 5.0以上的版本支持.
var delayCall = async () =>
{
await Task.Delay(System.TimeSpan.FromSeconds(2));
Debug.Log("do something................");
};
delayCall();
EditorApplication.update
第二种利用Editor的Update生命周期, 也是比较简单, 虽然不是那么精准, 但是基本也是够用了.
public class DelayCall
{
/// <summary>
/// 延迟秒数
/// </summary>
private float m_Delay;
private Action m_Callback;
private float m_StartupTime;
public void Perform(float delay, Action callback)
{
m_Delay = delay;
m_Callback = callback;
EditorApplication.update += Update;
}
// 主动停止
public void Stop()
{
m_StartupTime = 0;
m_Callback = null;
EditorApplication.update -= Update;
}
private void Update()
{
// 时间初始化放在这里是因为如果在某些类的构造函数中获取时间是不允许的
if (m_StartupTime <= 0) m_StartupTime = Time.realtimeSinceStartup;
if (Time.realtimeSinceStartup - m_StartupTime >= m_Delay)
{
if (m_Callback != null) m_Callback();
Stop();
}
}
}
public class Test
{
public static void Call()
{
Debug.Log("before..................");
new DelayCall().Perform(2, () => {
Debug.Log("after..................");
});
}
}
好了, 以上就是今天要分享和记录的内容, 希望对大家有所帮助.
|