【Unity】Luaが終了するまで待機する方法【Fungus】


FungusをLuaから操作する際に、Luaが終了するまで待機する方法を説明します。

前提としてUniRx/UniTaskの導入が必要です。

ステップ1 なぜ必要か?

Luaは非同期で処理されるため、Luaの終了をC#側で受け取るには

  • 終了を通知するメソッドをC#側で用意する必要がある。
  • Secene内のLuaEnvironmentの操作が必要である。
  • Luaに終了通知するC#のメソッドを記述する必要がある。

など手間がかかります。そこでFungus側のソースコードを修正して、上記の手間をなくそうと思います。

ステップ2 LuaEnvironment.cs

LuaEnvironment.csに以下のメソッドを追加します。

public IEnumerator RunLuaFunction(Closure closure)
{

    DynValue co = interpreter.CreateCoroutine(closure);

    while (co.Coroutine.State != CoroutineState.Dead)
    {
        try
        {
            co.Coroutine.Resume();
        }
        catch (InterpreterException ex)
        {
            LogException(ex.DecoratedMessage, GetSourceCode());
        }

        yield return null;
    }
}

ステップ3 LuaScript.cs

LuaScript.csに以下のメソッドを追加します。

using Cysharp.Threading.Tasks;

※usingの追加が必要です。

public async UniTask OnExecuteAsync()
{
    InitLuaScript();

    await luaEnvironment.RunLuaFunction(luaFunction);
}

ステップ4 C#側の呼び出し方

Luaの実行方法はこの記事のステップ6を参照してください。

public async void OnFungusAsync()
{
    Debug.Log($"開始");

    // Luaが終了するまで待機する。
    await _luaScript.OnExecuteAsync();

    Debug.Log($"終了");
}