はじめに
Unityでアプリ製作しているときに処理を一定時間後(n秒後)に実行したい!非同期処理のsleepやwaitのような使い方ができる方法があるのか?と思い、調べました。
環境
- Unity 2021.1.11f1
指定秒後(n秒後)に処理を実行
やり方はいくつかあります。
Unityの機能のみで対応する方法1(おすすめしない)
Invoke()で呼びたいメソッドをしています。
ただし、この方法はおすすめしません。メソッド名が変わった場合、文字列も変更が必要だからです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SampleScene : MonoBehaviour
{
void Start()
{
Invoke("Test", 5.0f);
}
private void Test()
{
Debug.Log("5秒後に実行される");
}
}
Unityの機能のみで対応する方法2
コルーチンを利用する方法です。もしUnityの機能のみでやる場合はこちらがおすすめです。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class SampleScene : MonoBehaviour
{
void Start()
{
StartCoroutine(DelayCoroutine(5.0f, () => {
Test();
}));
}
private void Test()
{
Debug.Log("5秒後に実行される");
}
private IEnumerator DelayCoroutine(float seconds, UnityAction callback)
{
yield return new WaitForSeconds(seconds);
callback?.Invoke();
}
}
DOTweenを使う方法
DOTweenのDOVirtual.DelayedCall()を利用します。
DOTweenを使っている場合はこれが一番ラクです。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class SampleScene : MonoBehaviour
{
void Start()
{
DOVirtual.DelayedCall(5.0f, () => {
Test();
});
}
private void Test()
{
Debug.Log("5秒後に実行される");
}
}
UniTaskを使う場合
awaitでUniTask.delay()で待つだけです。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using Cysharp.Threading.Tasks;
public class SampleScene : MonoBehaviour
{
void Start()
{
DelayAsync(5.0f, () => {
Test();
}).Forget();
}
private void Test()
{
Debug.Log("5秒後に実行される");
}
private async UniTask DelayAsync(float seconds, UnityAction callback)
{
await UniTask.Delay(TimeSpan.FromSeconds(seconds));
callback?.Invoke();
}
}
他にも方法はあると思いますが、一旦こんな感じです。
さいごに
ちなみに、どれがいいのかはよくわからない。。。
コメント