はじめに
ちょっとしたADVパートを実装する事になったため、実験がてらLuaを採用しようという話になり着手したのがきっかけです。
正直なところ、規模や内容的にCSVやxmlでも良かったとは思っていますが、後学のためにも採用しました。
Luaを使うための手段はいくつかある
いざ使うとなった時、流石に1から全て自前で実装するのは骨が折れので、調査をしていくつか候補を出しました。
最終的には上記の3つに絞られた上でインポートの容易さなどからMoonSharpを採用することになりました。
実際に動かしてみて
公式ドキュメントのチュートリアルを見ながら実装をすすめた結果以下の点が気になりました。
- デフォルトでは"Assets/Scripts"以下のluaファイルしか読めない
- ソリューションエクスプローラーで設定が必要
- UnityにTextAssetとして認識させるため、拡張子を.txtに書き換える必要がある
ファイルの配置は独自のスクリプトローダーを実装することで改善はできそうでしたが、後者は無理そうでした。
ファイルの設定をいちいち書き換えるのは面倒ですし、拡張子を.txtに書き換えるとVSCodeなどでインテリセンスが働かなくなるので論外でした。
.luaをTextAssetとしてインポート
妥協する案や、なんとか対応する案を検討した結果として、ScriptedImporter を使い.lua拡張子のファイルをTextAssetとしてロードし、DoString で実行する方向に決めました。
これにより、Unityが公式にサポートしていない拡張子を処理できるようになります。
これを LuaImporter.cs という名前で保存し、適当な場所に置けば、luaファイルをTextAssetとして扱えるようになります。
using UnityEngine;
using UnityEditor.AssetImporters;
using System.IO;
[ScriptedImporter(1, "lua")]
public class LuaImporter : ScriptedImporter
{
public override void OnImportAsset(AssetImportContext ctx)
{
var text = File.ReadAllText(ctx.assetPath);
TextAsset textAsset = new TextAsset(text);
ctx.AddObjectToAsset("Main", textAsset);
ctx.SetMainObject(textAsset);
}
}
ScriptedImporter は Unity 2020.3 以降に正式サポートされた機能な点にご注意ください。