ゲームを作ってると一定時間後に何かしらの処理を実行したい場面が結構出てくるので、自分用の備忘録も兼ねてご紹介します。
やりたいこと
今回はわかりやすく以下の内容で実装していきます。
2秒後に"Hello"をデバッグコンソールに出力する
方法
1.コルーチンを使用する
実装方法
using System.Collections;
using UnityEngine;
public class Sample : MonoBehaviour
{
void Start()
{
StartCoroutine(Delay());
}
private IEnumerator Delay()
{
// 2秒後待機
yield return new WaitForSeconds(2f);
Debug.Log("Hello");
}
}
2.Invokeを使用する
実装方法
using System;
using UnityEngine;
public class Sample : MonoBehaviour
{
void Start()
{
// 第一引数:関数名 第二引数:時間(秒)
Invoke(((Action)ConsoleOutputHello).Method.Name, 2f);
}
private void ConsoleOutputHello()
{
Debug.Log("Hello");
}
}
3.独自コンポーネントを作成する
下準備(独自コンポーネントの作成)
using System;
using UnityEngine;
public class DelayAction : MonoBehaviour
{
// 待機時間
private float m_delayTime = 0f;
public float DelayTime { set { m_delayTime = value; } }
// コールバック
private Action m_callback = null;
public Action Callback { set { m_callback = value; } }
void Update()
{
m_delayTime -= Time.deltaTime;
if (m_delayTime <= 0f)
{
m_callback.Invoke();
Destroy(this);
}
}
}
実装方法
using Unity.VisualScripting;
using UnityEngine;
public class Sample : MonoBehaviour
{
void Start()
{
DelayAction delayAction = this.AddComponent<DelayAction>();
delayAction.DelayTime = 2f;
delayAction.Callback = () =>
{
Debug.Log("Hello");
};
}
}
最後に
今回紹介したもの以外にも方法はあるかもしれませんが、きっと代表的なものはこの3つかなと。
基本的にはコルーチンで事が済むことが大半だと思いますが、基盤の仕様上コルーチンだと不都合がある場合にInvokeや独自コンポーネントで対応する感じになると思います。