【Unity】Fungusの選択結果をLuaで取得しC#に渡す方法

[前回](https://qiita.com/Humimaro/items/33d2efe2650c22b581e0)の記事の続きになります。

LuaからC#の関数、変数を呼び出し方を説明します。

LuaでUnity上の操作を行えるようになるので格段に表現方法が増えます。

前提条件としてHierarchyに

+ Flowchart
+ LuaEnvironment
+ LuaScript
+ LuaBindings

の４つの配置が必要です。

# ステップ１　値の受け渡しをするGameObjectを追加する

Unityで値を受け渡しするための、GameObjectを追加します。

ここでは仮に「MainManager」とします。
Hirerarchy上で空のGameObjectを追加し、名前を「MainManager」にしてください。
同名のC#スクリプトをProjectに追加し、Hirerarchy上の「MainManager」にアタッチします。

MainManagerに以下のスクリプトを記述してください。

```c#
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}");
    }
}
```

# ステップ２　LuaBindingsのObjectBindingsに新規行を追加する

LuaBindingsのObjectBindingsの「+」ボタンをクリックし、新しい行を追加します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/18d1b62d-771e-86f8-6d51-ccbe6b746afa.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/ce24bf59-9810-3a84-bd4f-a76a0d2ca758.png)


# ステップ３　MainManagerをObjectBindingsのObjectにアタッチする

ステップ２で追加したObjectBindingsのObjectにMainManagerをドラッグ＆ドロップします。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/5196b426-35c5-8ed1-9329-b3d8c902d7f5.png)

# ステップ４　ObjectBindingsのComponentのリストからMainManagerを選択する

ステップ３のタイミングでComponentのリストにMainManagerが追加されるので、選択します。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/347000ed-16ec-4b7c-25db-761bc802bffc.png)

# ステップ５　LuaからC#の関数、変数を呼び出し方を検索する

ステップ３のタイミングでMenberInfoにmainmanagerの項目が追加されます。
mainmanagerを選択するとpublicな関数、変数が表示されます。
変数は自動的にC#側の値を取得する「get_変数」関数、C#側に値を渡す「set_変数」関数が作成されます。

今回は試しに「set_Result(value)」を選択します。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/e9010d33-6791-e44b-236a-031a391a80f7.png)

LuaUsageの項目が表示され、Luaでの使用するためのスクリプトが提示されます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/94949495-3db0-ff7b-eb90-f65315980732.png)

# ステップ６　Luaスクリプトの作成

Luaスクリプトを記述します。

Luaスクリプトの作り方は[前々回の記事](https://qiita.com/Humimaro/items/76e1730dde5c359f61ba)を参考にしてください。

```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()
```

```lua
local result = mainmanager.get_Result()
```
でC#側からLua側に値を引き渡しています。

```lua
mainmanager.set_Result(result)
```
でLua側からC#側に値を引き渡しています。

ステップ１のC#側の関数「OnFungusStart」を実行するとLuaを仲介しFungusにC#側の値を引き渡していることが確認できます。

注意点としましては、Lua側は非同期で実行されるため、呼び出し結果はコールバック関数を用意し、Lua側で呼び出す必要があります。