2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-14

前回の記事の続きになります。

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の「+」ボタンをクリックし、新しい行を追加します。

1.png

2.png

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

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

3.png

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

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

4.png

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

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

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

5.png

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

6.png

ステップ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側で呼び出す必要があります。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?