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