SendMessage


宴のシナリオから、Unity側の処理のプログラムを呼ぶ。簡易的な拡張機能のためのもの。

サンプル

リファレンス

Command 説明 Arg1 Arg2 Arg3 Arg4 Arg5 Arg6
SendMessage あらかじめ設定されたAdvEngine外のオブジェクトにSendMessageをする
簡易的な拡張機能のためのもの
識別のための名前 任意 任意 任意 任意 任意

SendMessageを使うと、宴のシナリオから、Unity側で用意してある独自処理を呼ぶことができます。

SendMessageを使うための準備

SendMessageを受け取るには、AdvScenarioPayerコンポーネントにメッセージを受け取るオブジェクトを設定します。

メッセージを受け取るコンポーネントをアタッチしたオブジェクトをドラッグ&ドロップで設定する

SendMessageを受け取るサンプル

RecievMessageオブジェクトには、メッセージを受け取るスクリプトをAddComponentする必要があります。

メッセージを受け取るコンポーネントには、

  • OnDoCommand SendMessageコマンドの中身を受け取るメソッド
  • OnWait SendMessageコマンドを待機させるかどうかのメソッド

以上、二つが必要になります。サンプルをみてみましょう

    using UnityEngine;
    using UnityEngine.UI;
    using Utage;


    /// <summary>
    /// ADV用SendMessageコマンドから送られたメッセージを受け取る処理のサンプル
    /// </summary>
    [AddComponentMenu("Utage/ADV/Examples/UtageRecieveMessageSample")]
    public class UtageRecieveMessageSample : MonoBehaviour
    {
        public AdvEngine engine;            //Advエンジン本体
        public InputField inputFiled;       //テキスト入力用のオブジェクト

        void Awake()
        {
            inputFiled.gameObject.SetActive(false);
        }

        //SendMessageコマンドが実行されたタイミング
        void OnDoCommand(AdvCommandSendMessage command)
        {
            switch (command.Name)
            {
                case "DebugLog":
                    DebugLog(command);
                    break;
                case "InputFileld":
                    InputFileld(command);
                    break;
                default:
                    Debug.Log("Unknown Message:" + command.Name );
                    break;
            }
        }

        //SendMessageコマンドの処理待ちタイミング
        void OnWait(AdvCommandSendMessage command)
        {
            switch (command.Name)
            {
                case "InputFileld":
                    //インプットフィールドが有効な間は待機
                    command.IsWait = inputFiled.gameObject.activeSelf;
                    break;
                default:
                    command.IsWait = false;
                    break;
            }
        }

        //デバッグログを出力
        void DebugLog(AdvCommandSendMessage command)
        {
            Debug.Log(command.Arg2);
        }

        //設定された入力フィールドを有効化
        void InputFileld(AdvCommandSendMessage command)
        {
            inputFiled.gameObject.SetActive(true);
            inputFiled.onEndEdit.RemoveAllListeners();
            inputFiled.onEndEdit.AddListener((string text) => OnEndEditInputFiled(command.Arg2, text));
        }

        //入力終了。入力されたテキストを宴のパラメーターに設定する
        void OnEndEditInputFiled(string paramName, string text)
        {
            if (!engine.Param.TrySetParameter(paramName, text))
            {
                Debug.LogError(paramName + "is not found");
            }
            inputFiled.gameObject.SetActive(false);
        }
    }

これはあくまでサンプルです。
このスクリプトをコピーするなりして、好きな名前のスクリプトを作ってください。
OnDoCommandとOnWait中身は処理に応じて書き換えてください。

command.Nameには、エクセルのSendMessageコマンドの「Arg1」で設定した文字が入ります。
Arg1を独自拡張する処理の名前として、switch文などで、独自拡張の処理をそれぞれ記述していってください。

commandのメンバには、Arg2~5までの文字列が入っているので、それぞれ好きなように使ってみてください。

補足 宴のパラメーター操作

また、宴のシナリオ内で使用するパラメーターは

        public AdvEngine engine;
        void Hoge()
        {
            engine.Param.GetParameter(“flag1");
            engine.Param.TrySetParameter(“flag1”,true);
        }

などとして、スクプト上から操作可能なので、複雑な計算等をしたい場合は
SendMessageのタイミングで計算処理を呼び出し、その結果だけを
engine.Param内に設定するなどする・・・といった使い方もできます。

注意点

SendMessageでUnity側に独自に用意した機能は、宴でのセーブロードの対象にならないので注意してください。
たとえば、この機能で独自のオブジェクトを表示するなどしても、ロード後には消えてしまいます。
基本的にはそのページ内で完結する処理にすれば、セーブロードには関係ないので、ページをまたぐような処理にしなければ大丈夫です。
また、SendMessageの結果を今回のサンプルのようにパラメーターとして保存した場合も、セーブロードされるのでそういった使い方は大丈夫です。

もちろん、セーブロードを使用しない場合には自由に使っても大丈夫です。