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($"終了");
}