[Unity]やっぱりAddressableには同期読み込み欲しい。

Unity + MoonSharp + Addressable で苦労した話と、その対処です。

1.MoonSharpとは?

Luaというスクリプトを実行するための環境です。Unity向けのインテグレーションが存在します。
https://www.moonsharp.org

今回は、以下のムービーのゲームの弾幕の設定に使用しました。
https://www.youtube.com/watch?v=IIXtq_obUvo

2.始めにやったことと、問題点

まず、MoonSharpでのスクリプトの読み込みは、デフォルトではAssets/Resources/MoonSharp/Scripts以下から読み込むようになっているので、Addressableを使うためにはここに手を加える必要があります。

MoonSharpではScriptLoaderBaseの派生クラスのインスタンスを渡してやることで、スクリプトの読み込みをカスタムすることができます。
https://www.moonsharp.org/scriptloaders.html

こうしている理由としては、Luaスクリプトにはrequire()で他のファイルを読み込む機能があり、スクリプトを実行するまで依存関係にあるスクリプトはわからないからということが考えられます。

ScriptLoaderBaseの派生で実装する必要があるメソッドは以下の通りです。

public object LoadFile(string file, Table globalContext)
スクリプトfileを読み込みます。戻り値はスクリプトの文字列です。
public bool ScriptFileExists(string name)
スクリプトが存在するかを返します。

LoadFileは同期で読み込むことを求められていますが、Addressableには非同期ロードしかないので、以下のようなコードにしてみました。

public object LoadFile(string file, Table globalContext){
    AsyncOperationHandle<TextAsset> handle = 
        Addressables.LoadAssetAsync<TextAsset>("BulletScript/" + file + ".txt");
    Task.WaitAll(handle.Task);
    return handle.Status == AsyncOperationStatus.Succeeded ?
        handle.Result.text : "assert(false, \"Load Failed.\");"
}

 が、このコードを実際に動かすと、デッドロックになってしまいます。

ここから先は

1,054字

¥ 120

サポートでいただいたお金は、音素材やアセットの購入、グラフィックや曲の発注に使わせていただこうと思います。