いんでぃーづ

ゲームいろいろ、いろいろ自由

Invoke , Coroutine , SendMessage で文字列を使わない方法

タイトルにあげた関数は遅延処理、並列処理、オブジェクト間通信を簡単に記述できるので便利なのですが、関数名を文字列で指定して呼び出す場合は注意する必要があります。

Invoke("TestInvoke");

上記のように書き、あとで関数の名前を変更したときに、どうしても文字列の修正漏れが出てしまいます。

それを未然に防ぎたい場合、ここに上げる方法を使えば、修正漏れをコンパイルエラーとして知ることができます。

Invoke の場合

System.Action デリゲート型を使います。

using UnityEngine;
using System.Collections;
using System;

public class TestInvoke : MonoBehaviour {

  void Start () {
    // Invoke
    Invoke (((Action)TestInvokeMethod).Method.Name, 1f);

  }

  public void TestInvokeMethod() {
    Debug.Log("Invoke!");
  }

}

Coroutineの場合

IEnumeratorを使う方法と、Funcデリゲートを使う方法があります。

IEnumeratorを使う

こちらはCoroutineの基本的な使い方でもあります。

using UnityEngine;
using System.Collections;
using System;

public class TestCoroutine : MonoBehaviour {

  void Start () {
    // StartCoroutine (引数あり)
    StartCoroutine (TestCoroutine(1));
  }

  IEnumerator TestCoroutine(int test) {
    Debug.Log(string.Format("Coroutine! : {0}", test));
    yield return new WaitForSeconds(2f);
    Debug.Log("Finish.");
  }
}

StopCoroutineしたい場合はIEnumeratorを保存する必要があります。

public class TestInvoke : MonoBehaviour {
  IEnumerator routine;

  IEnumerator Start () {
    // IEnumeratorを使ったStartCoroutine & StopCoroutine
    routine = TestCoroutine(2);
    StartCoroutine(routine);

    yield return null;

    StopCoroutine(routine);
  }


  IEnumerator TestCoroutine(int test) {
    Debug.Log(string.Format("Coroutine! : {0}", test));
    yield return new WaitForSeconds(2f);
    Debug.Log("Finish.");
  }
Funcデリゲートを使う

Invokeと似た方法です。

StartCoroutine (((Func<int, IEnumerator>)TestCoroutine).Method.Name, 1);

止める場合は

StopCoroutine(((Func<int, IEnumerator>)TestCoroutine).Method.Name);

SendMessage の場合

たいていの場合は別クラスの関数名を使いたいと思うので、どこかに文字列の変数としてとっておく必要があります。

受信する側

public class TestReceiveMessage : MonoBehaviour {
  static public string SendMessageMethod;

  void Start () {
    SendMessageMethod = ((Action)ReceiveMessageMethod).Method.Name;
  }

  void ReceiveMessageMethod() {
    Debug.Log("Receive Message!");
  }

}


送信する側

public class TestSendMessage : MonoBehaviour {

  public GameObject target;

  void Start () {
    // targetは受信する側にリンクしておく
     target.SendMessage(TestInvoke.SendMessageMethod);
   }


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。