読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

引数を渡して遅延処理【Unity】【拡張メソッド】

Unity 拡張メソッド

このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 5.1.0f3 Personal

Invoke

Unityで一定時間後に処理を行うといった遅延処理を行う場合、

Invokeというメソッドがあります。

//1秒後にDelayMethodというメソッドを実行
Invoke("DelayMethod", 1.0f);


簡単に使えますが、メソッドの指定が文字列だったり、

引数が渡せなかったりと、不便な点も多くなかなか使い辛いモノです。


コルーチン

また、コルーチンを使う方法もあります。

private void Start() {
  StartCoroutine(DelayMethod(1.0f, "test"));
}

IEnumerator DelayMethod(float delay, string text) {
  //delay秒待つ
  yield return new WaitForSeconds(delay);
  /*処理*/
}


この方法なら引数も渡せますし、メソッド名も文字列指定ではありません。

さらこの/*処理*/の部分を別メソッドにし、デリゲートで渡してやれば、使い勝手が良くなります。

private void Start()
{
    //3.5秒後に実行する
    StartCoroutine(DelayMethod(3.5f, () =>
    {
        Debug.Log("Delay call");
    }));
}

/// <summary>
/// 渡された処理を指定時間後に実行する
/// </summary>
/// <param name="waitTime">遅延時間[ミリ秒]</param>
/// <param name="action">実行したい処理</param>
/// <returns></returns>
private IEnumerator DelayMethod(float waitTime, Action action)
{
    yield return new WaitForSeconds(waitTime);
    action();
}


上記の記事でもあるようにこれを拡張メソッドとして作成しておけば、

いつでも使えて便利ですね。


MonoBehaviorExtentsion

という事でその拡張メソッドが以下の通りです。



使い方はこんな感じ、

StartCoroutine(this.DelayMethod(1.0f, Method, "test"));

private void Method(string text){
  Debug.Log(text);
}


StartCoroutine(this.DelayMethod(遅延時間, メソッド, 引数));

という形式で、引数は0〜2個まで設定出来るようにしています。


これで簡単に引数を渡して遅延処理出来ますね……!