Unityスクリプトに依存しないタイマ

2673 ワード

タイミング数秒コールバック
コラボレーションタスクはタイマを作ることができますが、最大の問題は、スクリプトで使用する必要があります.使いやすいように、スクリプトに依存しないタイマをカプセル化することです.
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遅延機能のいくつかの実装を参照できる.