Unity側のプログラムを呼ぶ(名前指定)


投稿日:2015年9月15日 | 最終更新日:2024年5月15日

SendMessageByNameコマンドを使ことで宴のシナリオからUnity側の指定の名前のオブジェクトにSendMessageが可能です。
BroadcastMessageByNameコマンドでは指定の名前オブジェクト以下にあるオブジェクト全てにSendMessageが可能です。

リファレンス

Command 説明 Arg1 Arg2 Arg3 Arg4 Arg5 Arg6
SendMessageByName 指定の名前のGameObjectにSendMessageする GameObject名 呼び出すメソッド名 任意引数 任意引数 任意引数 任意引数
BroadcastMessageByName 指定の名前のGameObjectにBroadcastMessageする GameObject名 呼び出すメソッド名 検索対象 任意引数 任意引数 任意引数

SendMessageByName

簡易的な拡張のためのコマンドです。
事前の設定が必要ないためSendMessageコマンドよりも簡易的に使えるほか、動的に作成するオブジェクトにも使用可能です。

指定した名前のGameObjectを全シーンから検索して、そのコンポーネントのメソッドを呼び出します。
検索にUnityのFindObjectという処理の重い機能を使っています。
コマンド実行時に一度だけ呼ぶので、気にする必要はないかもしれませんが、速度重視するならSendMessageコマンドのほうを検討してください。
また、全シーン内で同じ名前のGameObjectがあると間違ってそちらにメッセージを送信する可能性がありますので、名前が重複しないGameObjectを対象にするようにしてください。
また、UnityのFindObjectの仕様上、非アクティブなオブジェクトは検索対象にならない点も注意してください。

サンプル

送ったメッセージを受け取るためのコンポーネントのサンプル

SendMessageByNameは送ったメッセージを受け取るためのコンポーネントを、対象のオブジェクトにAddComponentしてある必要があります。

Arg1で指定した名前のオブジェクトをUnity側で作成し、メッセージを受け取るコンポーネントを記述する。

エクセルで記述したArg2~Textなど、各セルの内容は、command.ParseCellOptional<>で取得可能なので、柔軟に引数を持たせることが可能です。

using UnityEngine;
using Utage;
using System.Collections;

/// <summary>
/// ADV用SendMessageByNameコマンドから送られたメッセージを受け取る処理のサンプル
/// </summary>
[AddComponentMenu("Utage/ADV/Examples/SendMessageByName")]
public class SampleSendMessageByName : MonoBehaviour
{
    //Testという処理を呼ぶ。引数にはAdvCommandSendMessageByNameを持つ
    void Test(AdvCommandSendMessageByName command)
    {
        Debug.Log("SendMessageByName");
    }

    //引数を使った例
    void TestArg(AdvCommandSendMessageByName command)
    {
        Debug.Log(command.ParseCellOptional<string>(AdvColumnName.Arg3, "arg3"));
    }

    //引数を使った例
    void TestWait(AdvCommandSendMessageByName command)
    {
        StartCoroutine(CoWait(command));
    }

    //command.IsWaitでコマンド終了待ちも切り替えられる
    IEnumerator CoWait(AdvCommandSendMessageByName command)
    {
        command.IsWait = true;

        float time = command.ParseCellOptional<float>(AdvColumnName.Arg3, 0);
        while (true)
        {
            Debug.Log(time);
            time -= Time.deltaTime;
            if (time <= 0) break;
            yield return null
        }
        command.IsWait = false;
    }
}

BroadcastMessageByName

BroadcastMessageはSendMessageと似ていますが、「対象となる名前のGameObjectとその子オブジェクト以下全てのGameObject」にSendMessageがされます。
動的に作成されたり名前が決めづらいオブジェクトを対象にSendMessageをしたいときや、複数のコンポーネントに対して同じメッセージを同時に送信したいときに使用します。
ターゲットタイプを設定することで、対象を宴の描画オブジェクトに絞ることもできます。

検索対象(Arg3)

名前 説明
Default 全シーン内のすべてのGameObjectが対象
非アクティブなGameObjectは対象にならいので注意
UtageObject キャラクターやBg、Spriteなど宴のオブジェクトのみが対象
RenderTexture 宴の描画オブジェクトの設定でRenderTexutureを使っている場合の設定
RenderTexutureの場合、子オブジェクト内にプレハブインスタンスのGameObjectが存在しないためその対策

空欄時はDefaultになります。

DefaultはUnityの全シーン内のすべてのオブジェクトが検索対象になりますので処理が重い点に中止してください。

UtageObjectやRenderTextureは、描画オブジェクトにプレハブなどを使用しているときに使うことを想定しています。
プレハブ内のコンポーネントにメッセージを送信して操作したいときに使ってください。
また、UtageObjectやRenderTextureの場合は、対象のオブジェクトが限られているため検索処理が軽いです。

サンプル


送ったメッセージを受け取るためのコンポーネントのサンプル

SendMessageByNameと同様に送ったメッセージを受け取るためのコンポーネントを、対象のオブジェクトにAddComponentしてある必要があります。

public class SampleBroadcastMessageByName : MonoBehaviour
{
    //TestBroadcastMessageという処理を呼ぶ。引数にはAdvCommandSendMessageByNameを持つ
    void TestBroadcastMessage(AdvCommandBroadcastMessageByName command)
    {
        Debug.Log(command.ParseCellOptional(AdvColumnName.Arg4,""));
    }
}