Unityスクリプトに依存しないタイマ
2673 ワード
タイミング数秒コールバック
コラボレーションタスクはタイマを作ることができますが、最大の問題は、スクリプトで使用する必要があります.使いやすいように、スクリプトに依存しないタイマをカプセル化することです.
スクリプトでもクラスでも、必要に応じて呼び出すことができます.関連コードは次のとおりです.
毎秒コールバック
前のタイマは、何秒経過したコールバックの要件を満たしていますが、ゲームでは、表示時間などの秒ごとにコールバックする必要がある場合があります.コードに示すように、CustomYieldInstrunctionを継承すると、カスタムコラボレーションプログラムを処理できます.ここでKeepWaitingは,コンカレントを待ち続けるか否かを示し,時間的判断により間隔イベントを投げ出すか否かを算出する.
最後に,タイマを実現する他の方法もあり,Unity遅延機能のいくつかの実装を参照できる.
コラボレーションタスクはタイマを作ることができますが、最大の問題は、スクリプトで使用する必要があります.使いやすいように、スクリプトに依存しないタイマをカプセル化することです.
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
public class WaitTimeManager
{
private static TaskBehaviour m_Task;
static WaitTimeManager()
{
GameObject go = new GameObject("WaitTimeManager");
GameObject.DontDestroyOnLoad(go);
m_Task = go.AddComponent();
}
public static void CancelWait(ref Coroutine coroutine)
{
if (coroutine!=null)
{
m_Task.StopCoroutine(coroutine);
}
}
public static Coroutine WaitTime(float time, UnityAction callback)
{
return m_Task.StartCoroutine(Coroutine(time, callback));
}
private static IEnumerator Coroutine(float time, UnityAction callback)
{
yield return new WaitForSeconds(time);
if (callback!=null)
{
callback();
}
}
//
class TaskBehaviour : MonoBehaviour
{
}
}
スクリプトでもクラスでも、必要に応じて呼び出すことができます.関連コードは次のとおりです.
//
Coroutine coroutine = WaitTimeManager.WaitTime(5, () =>
{
print("5 ");
});
//
WaitTimeManager.CancelWait(ref coroutine);
毎秒コールバック
前のタイマは、何秒経過したコールバックの要件を満たしていますが、ゲームでは、表示時間などの秒ごとにコールバックする必要がある場合があります.コードに示すように、CustomYieldInstrunctionを継承すると、カスタムコラボレーションプログラムを処理できます.ここでKeepWaitingは,コンカレントを待ち続けるか否かを示し,時間的判断により間隔イベントを投げ出すか否かを算出する.
using UnityEngine;
using UnityEngine.Events;
public class CustomWait:CustomYieldInstruction
{
public override bool keepWaiting
{
get
{
// false
if (Time.time-m_StatTime>=m_Time)
{
return false;
}else if (Time.time - m_LastTime >= m_Interval)
{
m_LastTime = Time.time;
m_IntervalCallback();
}
return true;
}
}
private UnityAction m_IntervalCallback;
private float m_StatTime;
private float m_LastTime;
private float m_Interval;
private float m_Time;
///
///
///
public CustomWait(float time, float interval, UnityAction callback)
{
m_StatTime = Time.time;
m_LastTime = Time.time;
m_Time = time;
m_Interval = interval;
m_IntervalCallback = callback;
}
}
最後に,タイマを実現する他の方法もあり,Unity遅延機能のいくつかの実装を参照できる.