syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

LuaスクリプトをWindowsストア アプリで使う

(これは2013-04-25に書いた故OCNブログの記事を加筆修正したものです)

Windows 8上で動作する、Windowsストア アプリ(WinRTアプリ)でスクリプト言語Lua 5.2とそのC++バインダーであるLuabind 0.9を使う方法です。

そもそも公式の Luabind 0.9.1 はLua 5.2.x系列に対応してなくて、さらに最新版の Lua 5.2.2 もそのままではストア アプリ向けにビルドすることはできないんですが、わずかな修正(と制限)を加えるだけで一応動作するようになりました。何をどう変えたのか、は各自調べてください。

ちなみに、「Lua@空想具現化プログラミング」さんにてLuaANSIマルチバイト エンコードShift_JIS)に対応させる方法が紹介されていますが、せっかくMSがストア アプリでANSIマルチバイト サポートを捨てたのですから、Shift_JISなどという産業廃棄物にも劣る旧世紀の遺物を今更使うのはもうやめておきましょう*1。ちなみにLua for WindowsUTF-8/UTF-16にどうやって対応するか、は上記ストア アプリのサンプル コードを読めば一目瞭然です*2

下記はLuaストア アプリのサンプルのスクリーンショットです。単純なので使い方もなんとなく分かっていただけると思います。ビルド手順などの詳しい説明はGitHubリポジトリを参照してください。

https://sygh-jp.github.io/content_hosting/my_program_ss/StoreAppLuaTest_ss2013_04_22a.png

コードの二次利用は自由ですが、Boost, Lua, Luabindそれぞれのライセンスに従ってください。また、コードの利用は自己責任でお願いします。仮に損害が発生したとしても、当方は一切の責任を負いません。
なお、とるに足らないテスト用アプリではありますが、コレをこのままストアに提出することは絶対にやめてください。コレはあくまでサンプル コードです。そのまま提出してもたぶん審査で落ちるだけだと思いますが、もしコレをベースにして似たようなアプリを作成する場合、必ず何らかの独自機能をきちんと付加した上で、Package.appxmanifestのPublisherとPublisherDisplayNameをきちんと更新してください。この約束が守られていないアプリを発見した場合、しかるべきところに通報させていただきます。

ちなみにコードを二次利用する際、Lua, Luabindはクレジット表記する必要があったと思います(MITライセンス)。

余談:Windowsストア アプリと外部スクリプト

Windowsストア アプリでは、実行時にスクリプトを動的に差し替えるようなことはポリシー上できません。その代わり、すべてのスクリプトをパッケージに含める形であれば配布可能です。スクリプト言語Windowsストア アプリで使用する、というのは、あくまで開発効率を高めるためのひとつの手段(あるいはデスクトップ版アプリとの開発基盤共通化目的での使用のみ)だと思ってください。例えばユーザーがインターネット経由でダウンロードした外部スクリプトを使い、アプリの動作までをも変更・拡張できるようなMODやプラグインのためには使用できない、ということです。ストア アプリは制約が厳しすぎて、クリエイティブ系のツール開発プラットフォームにはまったく向いていません。

※2017-04-01追記:
GitHubに移管した際、LuabindをLua 5.3.4, Boost C++ 1.63.0に対応させましたが、Luabindは相変わらず公式の更新が止まっています。現在はSeleneSol/Sol v2といった後発のバインダーも出ているようなので、Luabindにこだわる必要もないでしょう。

※2020-12-27追記:
Lua 5.4.2に対応させました。Lua 5.2で追加されたビット演算ライブラリ bit32 はLua 5.3でdeprecatedとなり、Lua 5.4で完全廃止されています。

※2022-03-21追記:
2021-06-28の改訂により、Microsoftストアに公開されたアプリでも、ユーザーの同意を得たうえであれば、「製品の機能を強化するアドオンまたは拡張機能」を後から追加取得できるようになったようです。

10.1.5 を更新し、特定の追加の製品、アドオン、または拡張機能が製品内から使用できるようになりました。

*1:Shift_JISWindows-1252といったANSIコードページはINIファイルと肩を並べるくらい今すぐにでも滅ぶべき時代遅れの産廃技術です。

*2:実はSquirrelというスクリプト言語であれば、ビルドオプションによりVMをワイド文字対応にすることができるため、Windows環境ではストア アプリ/デスクトップ問わずLuaよりもSquirrelのほうが相性が良いでしょう。ストア アプリでSquirrelを使う方法はいずれまた紹介しようと思います。