PR

[Unity][C#]一定時間後(n秒後)に処理を呼び出す方法

Unity

はじめに

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を使う方法

DOTweenDOVirtual.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();
    }
}

他にも方法はあると思いますが、一旦こんな感じです。

さいごに

ちなみに、どれがいいのかはよくわからない。。。

おすすめ参考書

コメント

タイトルとURLをコピーしました