前回の記事の続きになります。
LuaからC#の関数、変数を呼び出し方を説明します。
LuaでUnity上の操作を行えるようになるので格段に表現方法が増えます。
前提条件としてHierarchyに
- Flowchart
- LuaEnvironment
- LuaScript
- LuaBindings
の4つの配置が必要です。
ステップ1 値の受け渡しをするGameObjectを追加する
Unityで値を受け渡しするための、GameObjectを追加します。
ここでは仮に「MainManager」とします。
Hirerarchy上で空のGameObjectを追加し、名前を「MainManager」にしてください。
同名のC#スクリプトをProjectに追加し、Hirerarchy上の「MainManager」にアタッチします。
MainManagerに以下のスクリプトを記述してください。
using Fungus;
using UnityEngine;
public class MainManager : MonoBehaviour
{
// Hirerarchy上に配置したLuaScriptをアタッチしておく。
[SerializeField] private LuaScript _luaScript;
// 選択肢の結果を格納する変数。
public int Result { get; set; } = 0;
// Luaスクリプトを実行し、Fungusを表示するメソッド
public void OnFungusStart()
{
// Luaスクリプト実行前。初期値の「0」が表示される。
Debug.Log($"result value 1 : {Result}");
// Luaスクリプトを実行し、Fungusの会話、選択肢を表示する。
_luaScript.OnExecute();
// Luaスクリプトは非同期で実行されるため、初期値の「0」が表示される。
Debug.Log($"result value 2 : {Result}");
}
// Fungusの終了を通知するコールバックメソッド
public void OnCallback()
{
// メソッド「OnFungusStart」の実行後に、このメソッドを実行すると、Fungusで選択した結果が表示される。
Debug.Log($"result value 3 : {Result}");
}
}
ステップ2 LuaBindingsのObjectBindingsに新規行を追加する
LuaBindingsのObjectBindingsの「+」ボタンをクリックし、新しい行を追加します。
ステップ3 MainManagerをObjectBindingsのObjectにアタッチする
ステップ2で追加したObjectBindingsのObjectにMainManagerをドラッグ&ドロップします。
ステップ4 ObjectBindingsのComponentのリストからMainManagerを選択する
ステップ3のタイミングでComponentのリストにMainManagerが追加されるので、選択します。
ステップ5 LuaからC#の関数、変数を呼び出し方を検索する
ステップ3のタイミングでMenberInfoにmainmanagerの項目が追加されます。
mainmanagerを選択するとpublicな関数、変数が表示されます。
変数は自動的にC#側の値を取得する「get_変数」関数、C#側に値を渡す「set_変数」関数が作成されます。
今回は試しに「set_Result(value)」を選択します。
LuaUsageの項目が表示され、Luaでの使用するためのスクリプトが提示されます。
ステップ6 Luaスクリプトの作成
Luaスクリプトを記述します。
Luaスクリプトの作り方は前々回の記事を参考にしてください。
-- C#側から値を取得する
local result = mainmanager.get_Result()
say("テスト選択肢を表示します。"..result)
-- 選択肢を表示する
local choice = choose{ "左", "右" }
if choice == 1 then
say("左を選択しましたね。")
elseif choice == 2 then
say("右を選択しましたね。")
end
-- 選択肢の結果を変数に格納する。選択肢の結果は左から1で始まる。
result = choice
say("テスト選択結果を表示します。"..result)
-- 選択肢の結果をC#側に通知する
mainmanager.set_Result(result)
-- Fungus側の処理が終わったことをUnityに通知する。
mainmanager.OnCallback()
local result = mainmanager.get_Result()
でC#側からLua側に値を引き渡しています。
mainmanager.set_Result(result)
でLua側からC#側に値を引き渡しています。
ステップ1のC#側の関数「OnFungusStart」を実行するとLuaを仲介しFungusにC#側の値を引き渡していることが確認できます。
注意点としましては、Lua側は非同期で実行されるため、呼び出し結果はコールバック関数を用意し、Lua側で呼び出す必要があります。