【Unity】FungusのLuaで非同期処理を待機する方法


結論

Fungusが提供しているLua関数群の「runwait」を用います。

前提

C#側の関数は「IEnumerator」を戻り値にする必要があります。

応用方法

前回の記事のLuaが終了するまで待機する方法とあわせると、

  • Fungus側で会話1
  • Unity側でイベント
  • Fungus側で会話2
  • Unity側で終了を検知

することができるので、チュートリアルやRPGのイベントなどの表現の幅がぐっと広がります。

例)番号順に処理されます

C#側

// UnityのButtonで呼び出す関数
public async void OnFungusAsync()
{
    Debug.Log($"1 Luaの呼び出し開始");

    await _luaScript.OnExecuteAsync();

    Debug.Log($"6 Luaの呼び出し終了");
}

// Luaで呼び出している関数
public IEnumerator OnMoveCoroutine()
{
    Debug.Log("3 C#側で開始");

    // DoTweenを使い移動処理を行う
    transform.DOMove(new Vector3(1f, 1f, 0f), 5f);

    // 移動が終わるまで待機する
    yield return new WaitForSeconds(5f);

    Debug.Log("4 C#側で終了");
}

Lua側

say("2 Lua開始")

-- C#側の非同期関数を呼び出す
runwait(mainmanager.OnMoveCoroutine())

say("5 Lua終了")

その他

非同期を投げっぱなしにする関数「run」も用意されています。

Fungasが提供している関数は

\Assets\Fungus\Thirdparty\FungusLua\Resources\Lua\fungus.txt

を参照するとわかると思います。