時間遅延の実行

1秒後、2秒後、3秒後にそれぞれのタイミングでメソッドを実行するケースを考えてみましょう

一定時間ごとに実行されるコード

Invokeメソッドは、第1引数に実行されるメソッド、第2引数に秒数を取ります

第1引数はあえて難しく書いていますが、"View1″だと間違って"Veiw1″としてもエラーにならないための工夫です

// Invoke("View1", 1);と同じ
Invoke(nameof(View1), 1);

1秒、2秒、3秒後にメソッドが実行されます

using UnityEngine;

public class DeferredExecution : MonoBehaviour
{
    void Start()
    {
        // 1秒後にView1メソッドを実行
        Invoke(nameof(View1), 1);
        // 2秒後にView2メソッドを実行
        Invoke(nameof(View2), 2);
        // 3秒後にView3メソッドを実行
        Invoke(nameof(View3), 3);
    }

    void View1()
    {
        Debug.Log("ビュー1");
    }

    void View2()
    {
        Debug.Log("ビュー2");
    }

    void View3()
    {
        Debug.Log("ビュー3");
    }
}

タイミングよく3秒付近でスペースを押すとOKとなるコード

ゲームスタートからの秒数になります

Time.time;

経過時間の計算になります

float timing = Time.time - startTime;

押した時間が2.5秒よりあとで、3.2秒より前かを判断しています
ズルしていないかの判定!

if (2.5f < timing && timing < 3.2f)

全体コード

using UnityEngine;

public class DeferredExecution : MonoBehaviour
{
    float startTime;

    void Start()
    {
        startTime = Time.time;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            float timing = Time.time - startTime;

            if (2.5f < timing && timing < 3.2f)
            {
                Debug.Log("タイミングOK");
            }
            else
            {
                Debug.Log("タイミングNG");
            }
        }
    }
}

ジャン・ケン・ポンでタイミングよく押される様子をシミュレートしたコード

2つのコードを組み合わせました

using UnityEngine;

public class DeferredExecution : MonoBehaviour
{
    float startTime;

    void Start()
    {
        startTime = Time.time;
        // 1秒後にView1メソッドを実行
        Invoke(nameof(View1), 1);
        // 2秒後にView2メソッドを実行
        Invoke(nameof(View2), 2);
        // 3秒後にView3メソッドを実行
        Invoke(nameof(View3), 3);
    }

    void View1()
    {
        Debug.Log("ビュー1");
    }

    void View2()
    {
        Debug.Log("ビュー2");
    }

    void View3()
    {
        Debug.Log("ビュー3");
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            float timing = Time.time - startTime;

            if (2.5f < timing && timing < 3.2f)
            {
                Debug.Log("タイミングOK");
            }
            else
            {
                Debug.Log("タイミングNG");
            }
        }
    }
}

結果

次の結果サンプルは、タイミングよく押せなかった場合

ビュー1

ビュー2

ビュー3

タイミングNG

C#,Unity

Posted by hidepon