第3章 運用・配布

本章は Windows・ブラウザ・Android のビルド、配布物の作り方、動作確認の方法をまとめます。シナリオの書き方・フォルダの触り方は 制作者向け入門 を参照してください。パスはエンジンのルート(LUMINA Engine\)からの相対で書きます。

3.1 制作に必要な環境と編集する場所

シナリオ・素材の編集は Windows 上で行います。編集するのは lumina.exe が読む GameData で、ブラウザ版・Android 版のパックも Windows 版の書き出しから作ります。

項目内容
制作 PCWindows(テキストエディタ、同梱ツール、ビルド用スクリプトの実行)
編集するデータ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 を別の場所へ退避してください。
図3-1: ビルド・配布の流れ
キャプチャ差し替え images/03_operations.png

図3-1: ビルド・配布の流れ

図3-1: ビルド・配布の流れ — 差し替え: images/03_operations.png

3.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)

  1. build-win.bat(または build-win.ps1)を実行する。既定は Release と Debug の両方。build-win.ps1 Release で Release だけ
  2. 出力: build\win\bin\Release\・build\win\bin\Debug\(exe・DLL\・ツール)
  3. 続けて配布用の書き出し build\win\bin\master\<構成>\ を作る(3.3 を参照)。-NoStage を付けると書き出しを省く

Visual Studio 2026 の CMake を使います。パック作成ツール luminapack.exe もここで作られ、Release のときは Tool\01_Development\luminapack\ にも写されます。

ブラウザ版(build-web.bat)

  1. build-win.ps1 で書き出しを最新にしておく(luminapack.exe もここで作られる)
  2. build-web.bat を実行する(wasm のコンパイル → build-pack-data.ps1 -Targets web でパックを配置)
  3. 出力先: build\web\bin\

生成物:

確認は 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)

  1. build-win.ps1 で書き出しを最新にしておく
  2. 実機確認用: build-android.bat を実行する(arm64-v8a と x86_64 のネイティブライブラリ → パック → APK)
  3. 出力先: build\android\bin\lumina.apk(デバッグ用の鍵で署名済み)
  4. 端末へ入れて記録を見る: 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 を超える作品でも出せます)。

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.ps1Google Play 向け AAB(Play Asset Delivery)
build-android-aab.ps1 -Delivery fast-follow配り方の指定(install-time / fast-follow / on-demand)
build-android-aab.ps1 -NoMovies / -SkipPackAAB でも動画を外す/既存の .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 での起動が速くなります)。

出力先の一覧

プラットフォーム主な出力先起動・確認方法状況
Windowsbuild\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 を開く起動可
Androidbuild\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 配布パッケージ作成

推奨フロー

  1. アセット準備 — 画像は LuminaImageCompressor で .lgc にする(配布物には PNG などが入らない。下の「書き出しで外れる物」)。音声は BGM / SE を OGG Vorbis、ボイスを Opus に変換する(外部ツール可)
  2. スクリプト — build\win\bin\Release\GameData\data0 の system / scenario / macro / sim を編集する
  3. 暗号化 — ScriptEncryptor で .lsf にする。パスワードは Config.txt の System.setScriptPassword と同じにする。Config.txt だけは既定の鍵で暗号化する(エンジンがパスワードを知る前に読むため。コマンドラインでは --default-key)
  4. Windows で動作確認 — build\win\bin\Release\lumina.exe
  5. 書き出し — build-win.ps1 で build\win\bin\master\Release を作り直す
  6. ブラウザ / Android — build-web.bat / build-android.bat(APK)/ build-android-aab.ps1(AAB)。パックは書き出しから作られる
  7. 配布フォルダ — 書き出しから開発用のファイルを外す。または ReleaseBuilder で配布フォルダを作る(第7章)
  8. インストーラー(任意) — SetupBuilder でインストーラー/アンインストーラー/自動起動メニュー/パッチを作る
  9. 照合(任意) — 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 参照)。

図3-2: .laf パックと配布イメージ
キャプチャ差し替え images/03_operations_2.png

図3-2: .laf パックと配布イメージ

図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
Steammrusteam.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%\<ブランド名>\<ゲーム名>\<保存フォルダ名>\)へ回します。

深い場所(パスが 260 文字を超える)に置いたとき(Windows)

Windows のファイル操作は、既定では 260 文字までのパスしか扱えません。エンジンは長いパスを自動で \\?\ 付きの形にして開くので、深いフォルダに置いても絵・音・シナリオ・セーブを読み書きできます。この形を受け付けない機能(フォント登録・アイコン・カーソル・Media Foundation)は、メモリからの登録や一時フォルダへの写しなど別の方法で読みます。exe 自体のパスが 260 文字を超える置き方は、Windows が起動できないため対象外です。

3.5 環境変数と実行モード

実行モードの決め方は system/RunMode.txt の 1 か所にまとめてあります(PreInitialize.txt が起動時に 1 回実行します)。上から順に、最初に当てはまったものになります。

  1. 環境変数 LUMINA_RUNMODE が 1 → Debug / 0 → Release
  2. 開発中の印 data0/system/DevMode.txt がある → Debug(開発中の build\win\bin\Release・build\win\bin\Debug の GameData)
  3. 無い → Release(配布物)

印は data0\system の .txt なので、書き出しで外れ、配布物とそこから作るパック(.laf / Android / ブラウザ)には入りません。Debug 実行モードでは、タイトルに [Debug Mode | FPS] が出て、デバッグメニューが加わり、exe の隣に診断ログが残ります。配布物を Debug で動かしたいときは LUMINA_RUNMODE=1 を付けて起動します。config.ini の [Debug] DebugMode が効くのは INI を有効にした作品だけです(3.4)。

変数値効果
LUMINA_RUNMODE1 / 0Debug / Release に固定。1 のときは lumina_crash.log・pack_debug.log も作る
LUMINA_LANG_TEST言語 ID(例 en)その言語で起動する(確認用。選んだ言語は保存される)
LUMINA_SIMULATE_DEVICE_LOST秒数指定秒数のあとグラフィックスデバイスの喪失を装う(復帰の確認用。Windows)
LUMINA_AUTHOR_INIini のパスオーサリングツールからの起動用。パックで動いている配布物では無視される
デモ用の変数1LUMINA_3D_DEMO などで機能デモを起動(第11章)

ブラウザと Android には環境変数を渡す手段が無いため、代わりにブラウザはアドレスの ?KEY=VALUE(例 lumina.html?LUMINA_LANG_TEST=en)、Android はアプリのファイル置き場の launch.txt(1 行に 1 つ KEY=VALUE)を読みます。

3.6 ログ・診断

ログ出る条件・内容
lumina_debug.logDebug 実行モードのみ。スクリプトの実行記録(exe の隣)
lumina_diag.logDebug 実行モードのみ。時刻つきの診断記録。プラグインの読み込みは [プラグイン] ○○.dll を使う直前に読み込み: N ms の行で残る
systemsave_debug.logDebug 実行モードのみ。systemdata.dat の読み書き
lumina_crash.log / pack_debug.log環境変数 LUMINA_RUNMODE=1 を付けたときだけ(DevMode.txt だけでは作られない)。異常終了の情報/パックのマウント状況
plugin_load.jsonlDebug ビルドの exe のみ。プラグインの読み込み結果
%LOCALAPPDATA%\LUMINA\startup-prefetch\<指紋>.logWindows。起動からタイトルまでの時間と先読みした件数(第4章)
build\logs\ビルドの記録(<プラットフォーム>_<日時>.log、最新は latest-<プラットフォーム>.log)
Android の logcatrun-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 バージョン管理・配布の注意