SendMessageの特徴

SendMessageの特徴


SendMessageは基本的に関数起動と動作が同じであるがゲームオブジェクトに付随するコンポーネントのすべての同名関数が起動する点が大きく違う。またメッセージを発行したコンポーネントのコードは起動ラインで処理が停まり呼ばれた側の関数の処理が終わるまで待っている

例.
PlayerゲームオブジェクトにPlayerCtrlスクリプト、CharaAnimatorスクリプト、GridMoveスクリプトコンポーネントが付随している。
このPlayerゲームオブジェクトのPlayerCtrlスクリプト内でSendMessage ("OnDead");した場合、

CharaAnimator.OnDead()
GridMove.OnDead()
が存在していればこの二つが起動する。そしてこの関数の処理が終わるまでPlayerCtrlスクリプトのコードラインはそこで待機する

<要点>
一つのメッセージで複数の関数を起動し、呼んだ側のコードラインは呼ばれた側が処理を終えるまで、そこで待機する。
SendMessageを使うと疎結合しやすい。

MonoDevelopエディタはこれをコードエディット作業中、追跡する機能を持たない。製作者は同じゲームオブジェクト内にある各コンポーネントに
同名の関数が無いか探して意識しておく必要がある。これは検索を使ったりドキュメントアウトラインで探すと良い。これはユニティ独自の仕様





サンプル1

自分自身のコンポーネント内の関数に対してもSendMessage出来る。

SendMessageで起動された関数の処理内容が終了後、呼び出し元のラインに帰ってきて処理が継続されている事が確認できる。
WaitPrinterはコルーチンとしてマルチタスクで処理されている。

using UnityEngine;
using System.Collections;

public class MessageTest2 : MonoBehaviour {

  void Start () {
       SendMessage("Test");
       print("RoutineWork");
   }
   
   void Update () {}
   
   void  Test(){
       StartCoroutine("WaitPrinter");
       print("MessageRoutineWrok");
   }
   
   IEnumerator WaitPrinter()
   {
       yield return new WaitForSeconds(3.0f);
       print("WaitPrint");
   }
}

//MessageRoutineWrok
//RoutineWork
//WaitPrint



サンプル2

<GameObjectAのスクリプト>

using UnityEngine;
using System.Collections;

public class MessageTest : MonoBehaviour {

  void Start () {
       GameObject.Find("GameObjectB").SendMessage("Test");
       print("GameObjectAPrint");
   }
   
   void Update () {}

}



<GameObjectBのスクリプト>

using UnityEngine;
using System.Collections;

public class MessageTest2 : MonoBehaviour {

  void Start () {}
   
   void Update () {}
   
   void  Test(){
       StartCoroutine("WaitPrinter");
   }
   
   IEnumerator WaitPrinter()
   {
       yield return new WaitForSeconds(3.0f);
       print("Test");
   }
}

メニュー



  • 最終更新:2014-06-13 10:48:09

このWIKIを編集するにはパスワード入力が必要です

認証パスワード