第3章 運用・配布
本章は Windows・ブラウザ・Android のビルド、配布物の作り方、動作確認の方法をまとめます。シナリオの書き方・フォルダの触り方は 制作者向け入門 を参照してください。パスはエンジンのルート(LUMINA Engine\)からの相対で書きます。
3.1 制作に必要な環境と編集する場所
シナリオ・素材の編集は Windows 上で行います。編集するのは lumina.exe が読む GameData で、ブラウザ版・Android 版のパックも Windows 版の書き出しから作ります。
| 項目 | 内容 |
|---|---|
| 制作 PC | Windows(テキストエディタ、同梱ツール、ビルド用スクリプトの実行) |
| 編集するデータ | build\win\bin\Release\GameData\data0〜data8(Debug 版で確かめるときは build\win\bin\Debug\GameData)。エンジン一式を受け取った場合は lumina.exe の隣の GameData |
| 配布用の書き出し | build\win\bin\master\Release。build-win.ps1 が実行のたびに作り直すので直接編集しない |
| Windows での確認 | build\win\bin\Release\lumina.exe を起動(開発中の印 DevMode.txt があるので Debug 実行モードで動く) |
| ブラウザ版 | build-web.bat で生成 → python serve-web.py で配信して確認 |
| Android 版 | build-android.bat で APK。Google Play 向けは build-android-aab.ps1 で AAB(Play Asset Delivery) |
clean は編集中の GameData ごと消します。build-win.ps1 clean(と build-all.ps1 clean)は build\win フォルダを丸ごと削除します。編集元の build\win\bin\Release\GameData と build\win\bin\Debug\GameData もその中にあるため、一緒に消えます。clean を使う前に、必ず GameData を別の場所へ退避してください。
images/03_operations.png
図3-1: ビルド・配布の流れ
images/03_operations.png3.2 プラットフォーム別ビルド・出力
データの流れは次の 1 本です。データを直したら、先に build-win.ps1(書き出しの更新)を実行してから、ブラウザ版・Android 版を作ってください。
build\win\bin\Release\GameData(編集)
→ build-win.ps1 → build\win\bin\master\Release(配布用の書き出し)
→ build-pack-data.ps1 → dataN.laf
→ build\web\bin\GameData\ (ブラウザ)
→ lumina\app\android\apk\assets\GameData\(Android の APK / AAB)
Windows 版(build-win.bat / build-win.ps1)
build-win.bat(またはbuild-win.ps1)を実行する。既定は Release と Debug の両方。build-win.ps1 Releaseで Release だけ- 出力:
build\win\bin\Release\・build\win\bin\Debug\(exe・DLL\・ツール) - 続けて配布用の書き出し
build\win\bin\master\<構成>\を作る(3.3 を参照)。-NoStageを付けると書き出しを省く
Visual Studio 2026 の CMake を使います。パック作成ツール luminapack.exe もここで作られ、Release のときは Tool\01_Development\luminapack\ にも写されます。
ブラウザ版(build-web.bat)
build-win.ps1で書き出しを最新にしておく(luminapack.exeもここで作られる)build-web.batを実行する(wasm のコンパイル →build-pack-data.ps1 -Targets webでパックを配置)- 出力先:
build\web\bin\
生成物:
lumina.html/lumina.js/lumina.wasm/lumina.icoGameData\data0.laf〜 とGameData\packlist.json(実際にあるパックの一覧。ブラウザはここに載ったパックだけを取りに行く)GameData\data8\… 動画。ブラウザで再生できる mp4 / m4v / webm だけを素のファイルで写す(パックには入れない)。ルール画像のdata7はパックに入る
確認は python serve-web.py で行います。部分取得(Range)に対応した配信で、既定は 8000 番、build\web\bin を配ります。http://localhost:8000/lumina.html を開いてください(番号は python serve-web.py 8080 のように変えられます)。WebGPU は https か localhost でしか動かないため、公開するサーバーは https にしてください。
build-web.ps1 単体はコンパイルだけで、パックを配りません。パックだけ作り直すときは build-pack-data.ps1 -Targets web を実行します。ツールチェインは同梱の
platform\sdk\emscripten(emsdk と、その python に入った ninja)を使います。無い場合ビルドは見送られます。
Android 版(build-android.bat / build-android-aab.ps1)
build-win.ps1で書き出しを最新にしておく- 実機確認用:
build-android.batを実行する(arm64-v8a と x86_64 のネイティブライブラリ → パック → APK) - 出力先:
build\android\bin\lumina.apk(デバッグ用の鍵で署名済み) - 端末へ入れて記録を見る:
run-android.ps1(USB デバッグを有効にした端末かエミュレータへインストールし、logcat を表示)
APK には、ビルド済みのすべての ABI が入ります(arm64-v8a は実機、x86_64 は PC のエミュレータ向け)。片方だけ作り直すときは build-android.ps1 -Abi x86_64 のように指定します。最小 API レベルは 24 です。
data8 に mp4 / m4v / webm があれば、APK に無圧縮のまま自動で同梱します(端末がファイルを直接開いて再生するため)。.ogv は入りません。-NoMovies で動画を外せます。
Google Play へ出す場合は、ネイティブライブラリを作ったあと build-android-aab.ps1 で lumina.aab を作ります。ゲームデータはアセットパックに分かれ、Play Asset Delivery で Play のサーバから配られます(APK の上限 150MB を超える作品でも出せます)。
-Deliveryで配り方を選べます:install-time(既定。インストールと同時に入る)/fast-follow(インストール直後に裏で入る)/on-demand(要求したときに入る)。fast-follow / on-demand は同梱の Play Core(lumina\app\android\libs\play-core-1.10.3.jar)で受け取ります- 端末で Play と同じ形を確かめるには
-Apks -Install(--local-testing付きの.apksを作って入れる) lumina.aabは署名されていません。Play Console へ上げる前に、アップロード鍵で署名してください。lumina.apksは確認用で、Play へは上げません
Android のツールは platform\sdk\android(android-ndk-*、sdk、jdk17、AAB 用の bundletool-all-*.jar)に置きます。
オプション(必要なときのみ):
| オプション | 意味 |
|---|---|
build-android.bat -NoMovies | 動画を APK に含めない(軽量 APK) |
build-android.bat -SkipPack | 既存の .laf を再利用(再パックを省略) |
-Icon / -Label / -Package | アイコン(.ico)・表示名・アプリ ID を指定(APK・AAB 共通。既定は Windows 版のアイコン、Config.txt の Window.setTitle と setSaveProduct から決まる) |
build-android.ps1 -Abi x86_64 | 指定した ABI のネイティブライブラリだけを作る |
build-android-aab.ps1 | Google Play 向け AAB(Play Asset Delivery) |
build-android-aab.ps1 -Delivery fast-follow | 配り方の指定(install-time / fast-follow / on-demand) |
build-android-aab.ps1 -NoMovies / -SkipPack | AAB でも動画を外す/既存の .laf を使う |
build-android-aab.ps1 -Apks -Install | 手元の端末で AAB 相当の形を確認 |
パックした Windows 版(build-pack-run.ps1)
build-pack-run.ps1 は、GameData を .laf にした Windows 版を build\win\bin\pack に組み立てます(素のファイルを数千本読む代わりに数本のパックを読むので、HDD での起動が速くなります)。
- 動画(
data8)は Release 側へのリンクで済ませます。-IncludeMoviesを付けると無圧縮のパックに入れ、パックからその場で再生します -Passwordでパックを暗号化できます。その場合はエンジンにも同じ語を入れる必要があります(CMake の構成で-DLUMINA_PACK_PASSWORD=同じ語)- Release 側の
SaveDataまで写すので、確認専用です。配布には使わないでください
出力先の一覧
| プラットフォーム | 主な出力先 | 起動・確認方法 | 状況 |
|---|---|---|---|
| Windows | build\win\bin\Release(開発)/build\win\bin\master\Release(配布用の書き出し)/build\win\bin\pack(build-pack-run.ps1 のパック版) | lumina.exe を起動 | 起動可 |
| Steam | (Windows 版 + mrusteam.dll + steam_api64.dll) | Steam 経由で起動。mrusteam.dll と steam_api64.dll を DLL\ に置き、Steam.init(appId) を呼ぶ(mrusteam.dll は既定の許可一覧に入っていて、使うときに自動で読み込まれる。第8章) | 起動可 |
| ブラウザ | build\web\bin\ | python serve-web.py で配信して lumina.html を開く | 起動可 |
| Android | build\android\bin\ | lumina.apk をインストール(run-android.ps1)。Play 向けは lumina.aab | 起動可 |
| Linux / iOS / PlayStation系 / Switch系 | — | — | 開発中(起動不可) |
まとめて作り直す場合は build-all.bat を使います(順序: Windows → ブラウザ(パック込み)→ Android(パックと APK 込み))。build-all.ps1 は各プラットフォームをコンパイルするだけで、パックも APK も作りません。
ビルドの記録は build\logs\<プラットフォーム>_<日時>.log に残り、最新回は build\logs\latest-<プラットフォーム>.log で見られます。
3.3 配布パッケージ作成
推奨フロー
- アセット準備 — 画像は
LuminaImageCompressorで.lgcにする(配布物には PNG などが入らない。下の「書き出しで外れる物」)。音声は BGM / SE を OGG Vorbis、ボイスを Opus に変換する(外部ツール可) - スクリプト —
build\win\bin\Release\GameData\data0のsystem/scenario/macro/simを編集する - 暗号化 —
ScriptEncryptorで.lsfにする。パスワードはConfig.txtのSystem.setScriptPasswordと同じにする。Config.txtだけは既定の鍵で暗号化する(エンジンがパスワードを知る前に読むため。コマンドラインでは--default-key) - Windows で動作確認 —
build\win\bin\Release\lumina.exe - 書き出し —
build-win.ps1でbuild\win\bin\master\Releaseを作り直す - ブラウザ / Android —
build-web.bat/build-android.bat(APK)/build-android-aab.ps1(AAB)。パックは書き出しから作られる - 配布フォルダ — 書き出しから開発用のファイルを外す。または
ReleaseBuilderで配布フォルダを作る(第7章) - インストーラー(任意) —
SetupBuilderでインストーラー/アンインストーラー/自動起動メニュー/パッチを作る - 照合(任意) —
FileCheckで配布ファイルを SHA-256 の一覧と突き合わせる
書き出し(build\win\bin\master\Release)で行われること
build-win.ps1 は build\win\bin\<構成> を build\win\bin\master\<構成> へ robocopy /MIR で写し、配布物に要らない物を外します。
| 対象 | 扱い |
|---|---|
画像(.png / .jpg / .jpeg / .bmp / .psd) | 外す。ただし data4\motion・data8 の下は残す(mrumotion・mruanime・3D の素材はファイル名を拡張子込みで指すため) |
data0\system・data0\scenario の .txt | すべて外す。.lsf が無い、または .txt より古いものは名前を出して知らせる(その場合、配布物ではそのスクリプトを開けない/古い中身で動く)。開発中の印 DevMode.txt もここで外れる |
data0\sim・data0\macro の .txt | .txt より新しい .lsf があるものだけ外す。.lsf が無い・古いものは .txt のまま残し、名前を出して知らせる |
data0\lang\<ID>\scenario の .txt | .lsf の対があるものだけ外す。無いものは残して知らせる |
data0\startup.txt | 外す(startup.lsf は残す) |
控え・作業用コピー(*.bak*、.orig、.rej、.tmp、名前に「 - 」を含む物) | GameData から外す(外した名前をログに出す) |
SaveData・*.log・Shaders | 写さない。書き出しに残っていれば消さずに build\win\bin\_stage_moved\<日時>\<構成>\ へ移す |
| Visual C++ 実行時ライブラリ(10 本) | Release の書き出しへ毎回入れる |
書き出し直下の readme*・license*・*.md など、_extra フォルダ | 書き出し側の独自ファイルとして残す(消さないが、写しもしない) |
exe の隣の License*.txt(エンジンのライセンス表記) | 書き出しに無ければ写す。書き出しに同じ名前の物があれば上書きせずに残し、中身が違うときだけ知らせる |
- 開発用のファイルが残っています。書き出しには
.pdb、LuminaDebugTools.dll、luminapack.exe、pack-all.bat、packconfig.ini、run-*.bat、ManualDesigner.exeなどが入ります。配布前に外すか、ReleaseBuilderを使ってください。EngineSetting.exe・SaveDataManager.exe・FileCheck.exe・Launcher.exeは利用者向けのツールなので、作品ごとに配るかどうかを決めます License.txtはbuild-win.ps1が書き出しへ写します。製品用の条文に差し替えたLicense.txtを書き出しに置いた場合は、そちらが残ります(次の書き出しでも上書きされません)- ゲーム内のライセンス表示(
data0/system/LicenseDialog.txt)が読むdata1/license_jp.txt(英語はlicense_en.txt)には、エンジンが使っているソフトウェアと書体の権利表示・ライセンスの本文が入っています(License.txtから作ったもの)。作品の権利表示は、これを消さずに書き足してください ReleaseBuilder(1.4.1)はDevMode.txtを収録せず、.lsfのそろった平文のスクリプト(.txt)は.lsfだけを入れます(.lsfの無い.txtはそのまま入ります)。.lsfが.txtより古いとき、エンジンの隣のconfig.iniに[Debug] DebugMode=1があるときは「要確認」を出します。それでも、渡すGameDataは書き出し(build\win\bin\master\Release\GameData)にしてください。開発中のGameDataを渡すと、作品の点検(LuminaNovelAuthor)が命令名で始まる説明の行を命令と読み違えてエラーにし、配布フォルダを作れません- 多言語の訳したシナリオは、暗号化(
.lsf)を忘れると.txtのまま配布物に入ります
Windows の配布物には Shaders フォルダは要りません(DirectX 12 のシェーダーは exe に埋め込んであります)。配布物は開発中の印 data0/system/DevMode.txt を含まないので Release 実行モードで動きます。
配布前の確認は、書き出しを開発用のフォルダの外へ写して行ってください(開発用のフォルダの中では、外にあると見つからない物も見つかってしまうため)。深い場所(パスが長い)・書き込めない場所でも起動できます(3.4 参照)。
最小配布物
Windows:
lumina.exe / lumina.ico / License.txt
Visual C++ 実行時ライブラリ 10 本(build-win.ps1 が書き出しへ自動で入れる)
GameData\(data0〜data8 のフォルダ、または dataN.laf)
DLL\(使う機能の DLL だけ)
ブラウザ:
lumina.html / lumina.js / lumina.wasm / lumina.ico
GameData/*.laf + GameData/packlist.json
GameData/data8/(動画を使う場合。mp4 / webm)
Android:
lumina.apk(assets/GameData/*.laf と動画を同梱)
Google Play: lumina.aab(ゲームデータは Play Asset Delivery)
config.ini は要りません(既定では使いません。3.4 参照)。
images/03_operations_2.png
図3-2: .laf パックと配布イメージ
images/03_operations_2.png機能別追加 DLL(Windows 配布時)
DLL は exe の隣の DLL\ フォルダに置きます。使う機能の分だけで構いません。
| 使用機能 | 追加 DLL |
|---|---|
| 動画(すべての形式) | lmmovie.dll |
| OGV 動画 | lmmovie.dll + mrutheora.dll |
| OGG 音声 | mruvorbis.dll |
| Opus 音声 | mruopus.dll |
| 部品アニメ | mruanime.dll |
| モーション | mrumotion.dll |
| システム情報 | systemInfo.dll |
| Steam | mrusteam.dll + steam_api64.dll |
| 光学ディスク保護 | AppCore.dll — エンジン非連携のサンプル(plugin\AppCore。ビルドもされず、エンジンからも読まれない) |
3.4 設定ファイル運用
config.ini
見本の Config.txt は System.setIniEnabled(false) と System.setIniAutoCreate(false) を指定しています。この状態ではエンジンは config.ini を読まず、書かず、作りもしません。設定は systemdata.dat に保存されます。
INI を有効にし、自動作成も有効にした場合だけ、exe のフォルダに次の雛形が作られます。
| セクション | 主なキー | 説明 |
|---|---|---|
[Window] | Title, Width, Height, TopMost, FPS, WindowResizable, AspectRatioLock, SingleInstance, SingleInstanceKey | ウィンドウ基本 |
[Display] | ScreenMode(FALSE / DirectX12 / Win32), WindowMode(Linear / Cubic / Lanczos / SharpLinear), CubicStrength, MultiCore, CoreCount, ExitDialog | 画面モード・拡大フィルタ |
[Confirm] | ExitType, MenuExitType, TitleExitType | 終了確認の種類(0=なし/1=MessageBox/2=リソースのダイアログ/3=画像のダイアログ) |
[Startup] | StartupDialog(既定 OFF), StartupScript(既定 startup.txt) | 起動ダイアログ・入口のスクリプト |
[SystemSave] | SaveRoot, SaveDataID, BrandName, GameName | 保存先 |
[Debug] DebugMode(1 / 0)は、INI を有効にしているときだけ読まれ、実行モードを上書きします。INI が無効(見本の設定)なら、config.ini を置いても無視されます。実行モードは system/RunMode.txt で決まります(3.5)。
systemdata.dat
利用者が変えた設定・既読・システムフラグ等の保存先です。保存先フォルダ(見本では exe の隣の SaveData\)に作られます。起動ダイアログの表示有無や画面モードなどは、保存した値が Config.txt の既定値より優先されます。
SaveDataManager ツールで保存先の確認・移動・初期位置への復元・削除ができます。
ゲームのフォルダに書き込めないとき(Windows)
保存先が InstallPath(exe の隣)で、そのフォルダに書き込めない場合(C:\Program Files の下・読み取り専用の媒体・権限の無い共有フォルダなど)は、セーブとシステムデータを自動で AppData(SaveRoot=AppData と同じ %APPDATA%\<ブランド名>\<ゲーム名>\<保存フォルダ名>\)へ回します。
- 書き込めるフォルダでは exe の隣に保存します。設定(SaveRoot)は書き換えないので、あとで書き込める場所へ移せば exe の隣へ戻ります。
- exe の隣に前のセーブがあれば、回した先へ写します(上書きはしません)。
- 最初の 1 回だけ、保存先をメッセージで知らせます。回した先に
README_SaveLocation.txtを置き、それがあれば次からは知らせません。
深い場所(パスが 260 文字を超える)に置いたとき(Windows)
Windows のファイル操作は、既定では 260 文字までのパスしか扱えません。エンジンは長いパスを自動で \\?\ 付きの形にして開くので、深いフォルダに置いても絵・音・シナリオ・セーブを読み書きできます。この形を受け付けない機能(フォント登録・アイコン・カーソル・Media Foundation)は、メモリからの登録や一時フォルダへの写しなど別の方法で読みます。exe 自体のパスが 260 文字を超える置き方は、Windows が起動できないため対象外です。
3.5 環境変数と実行モード
実行モードの決め方は system/RunMode.txt の 1 か所にまとめてあります(PreInitialize.txt が起動時に 1 回実行します)。上から順に、最初に当てはまったものになります。
- 環境変数
LUMINA_RUNMODEが1→ Debug /0→ Release - 開発中の印
data0/system/DevMode.txtがある → Debug(開発中のbuild\win\bin\Release・build\win\bin\Debugの GameData) - 無い → Release(配布物)
印は data0\system の .txt なので、書き出しで外れ、配布物とそこから作るパック(.laf / Android / ブラウザ)には入りません。Debug 実行モードでは、タイトルに [Debug Mode | FPS] が出て、デバッグメニューが加わり、exe の隣に診断ログが残ります。配布物を Debug で動かしたいときは LUMINA_RUNMODE=1 を付けて起動します。config.ini の [Debug] DebugMode が効くのは INI を有効にした作品だけです(3.4)。
| 変数 | 値 | 効果 |
|---|---|---|
LUMINA_RUNMODE | 1 / 0 | Debug / Release に固定。1 のときは lumina_crash.log・pack_debug.log も作る |
LUMINA_LANG_TEST | 言語 ID(例 en) | その言語で起動する(確認用。選んだ言語は保存される) |
LUMINA_SIMULATE_DEVICE_LOST | 秒数 | 指定秒数のあとグラフィックスデバイスの喪失を装う(復帰の確認用。Windows) |
LUMINA_AUTHOR_INI | ini のパス | オーサリングツールからの起動用。パックで動いている配布物では無視される |
| デモ用の変数 | 1 | LUMINA_3D_DEMO などで機能デモを起動(第11章) |
ブラウザと Android には環境変数を渡す手段が無いため、代わりにブラウザはアドレスの ?KEY=VALUE(例 lumina.html?LUMINA_LANG_TEST=en)、Android はアプリのファイル置き場の launch.txt(1 行に 1 つ KEY=VALUE)を読みます。
3.6 ログ・診断
| ログ | 出る条件・内容 |
|---|---|
lumina_debug.log | Debug 実行モードのみ。スクリプトの実行記録(exe の隣) |
lumina_diag.log | Debug 実行モードのみ。時刻つきの診断記録。プラグインの読み込みは [プラグイン] ○○.dll を使う直前に読み込み: N ms の行で残る |
systemsave_debug.log | Debug 実行モードのみ。systemdata.dat の読み書き |
lumina_crash.log / pack_debug.log | 環境変数 LUMINA_RUNMODE=1 を付けたときだけ(DevMode.txt だけでは作られない)。異常終了の情報/パックのマウント状況 |
plugin_load.jsonl | Debug ビルドの exe のみ。プラグインの読み込み結果 |
%LOCALAPPDATA%\LUMINA\startup-prefetch\<指紋>.log | Windows。起動からタイトルまでの時間と先読みした件数(第4章) |
build\logs\ | ビルドの記録(<プラットフォーム>_<日時>.log、最新は latest-<プラットフォーム>.log) |
| Android の logcat | run-android.ps1 がエンジンの記録を絞って表示する |
| ブラウザのコンソール | 開発者ツールのコンソールに記録が出る |
動作確認用コマンド(Windows)
lumina.exe --smoke-test-systemdata
画面を出さずに systemdata.dat の作成・読み込み・保存だけを行って終了します。起動位置を変えるコマンドライン引数は 第6章、セーブ形式は第 4 章・第 6 章を参照してください。
3.7 トラブルシューティング
| 症状 | 確認事項 |
|---|---|
| プラグインが読めない | Initialize.txt の setAllowedPlugins に載っているか、DLL が DLL\ にあるか。lumina_diag.log の [プラグイン] の行 |
| OGV が再生できない | mrutheora.dll と lmmovie.dll が許可一覧と DLL\ にあるか(許可されていれば最初の再生時に自動で読まれる)。ブラウザ/Android では OGV は使えないので同じ名前の mp4 を置く |
| OGG が鳴らない | mruvorbis.dll、拡張子が .ogg か |
| Android で音が鳴らない | Android は WAV を再生できない。OGG Vorbis か Opus にする |
| 配布物で絵が出ない | 書き出しで PNG などは外れる。.lgc に変換したか(LuminaImageCompressor) |
| 配布物でスクリプトが読めない | .lsf を作ったか(書き出しは system / scenario の .txt を外す)、パスワードが System.setScriptPassword と同じか、Config は既定の鍵で暗号化したか |
| ブラウザで案内文だけが出る | WebGPU が使えない。対応ブラウザか、https(または localhost)で開いているか |
| 画面が真っ黒 | グラフィックドライバ、プラットフォーム別の描画制限 |
| Windows では動くが他で崩れる | プラグイン・動画・ネイティブ UI の有無。ブラウザ/Android でも再確認 |
| 多重起動の扱い | Config.txt の Window.setSingleInstance / Window.setSingleInstanceKey |
3.8 バージョン管理・配布の注意
- 編集元は
build\win\bin\Release\GameData(とDebug\GameData)。Initialize.txt/Config.txtもここで直す - 書き出し先(
build\win\bin\master\Release・build\web\bin\GameData・lumina\app\android\apk\assets)は直接編集しない build-win.ps1 cleanはbuild\winごと消す。実行前にGameDataを退避する(3.1 の注意)- 配布物には
License.txt(exe と同じフォルダ。エンジン・プラグイン・第三者ライブラリのライセンス。書き出しには自動で入る)を入れ、ゲーム内のライセンス表示(data1/license_jp.txt・license_en.txt)には作品の権利表示を書き足す(エンジンと第三者の表示は消さない)