Unity側のプログラムを呼ぶ


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

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の結果を上記のサンプルのようにパラメーターとして保存した場合はセーブロードされるので、それが最もシンプルな対応法です。
独自の形式でセーブデータに対応したい場合は、セーブデータを独自拡張するを参考にしてください。