Ren'Pyでゲームを作っていると、こんなことに気づくかもしれない。
play music "戦闘BGM.ogg"
日本語ファイル名が、普通に通る。エラーも出ない。
「じゃあ日本語ファイル名で管理すれば楽じゃないか」と思うかもしれないが、結論から言うとやめたほうがいい。この記事では、なぜ動くのか、なぜ危ないのか、そして安全な代替手段を解説する。
結論:動くが非公式
Ren'Py 8.5.2 では、画像・音声・動画のファイル名に日本語(非ASCII文字)を使っても、多くの環境で動作する。
ただし、これは Ren'Py が公式にサポートしている機能ではない。Ren'Py の作者である Tom Rothamel(PyTom)は、Lemma Soft Forums で一貫して次のように述べている。
ファイル名には ASCII 文字だけを使うべきだ。それが配布とクロスプラットフォーム互換性を大幅に楽にする。
公式ドキュメントにも、Unicode ファイル名が正式にサポートされているという記述はない。
なぜ動くのか:Python 3のUnicode処理
日本語ファイル名が通る理由を理解するには、Python の歴史を少し知る必要がある。
Python 2 時代(Ren'Py 6.x / 7.x)
Python 2 では、文字列はデフォルトでバイト列(str = bytes)だった。日本語を扱うには u"" プレフィックスで明示的に Unicode 文字列を作る必要があった。
# Python 2 — これはバイト列
"戦闘BGM.ogg"
# Python 2 — これがUnicode文字列
u"戦闘BGM.ogg"
Ren'Py 6.x では、音声ファイルの内部処理が C 関数に char* 型で渡されていたため、Unicode ファイル名は UnicodeEncodeError でクラッシュしていた。この問題は 2014年に修正 されたが、根本的に Python 2 の文字列処理には限界があった。
Python 3 時代(Ren'Py 8.x)
Python 3 では、文字列がデフォルトで Unicode になった。
# Python 3 — これがもうUnicode
"戦闘BGM.ogg"
u"" プレフィックスは不要になり、すべての文字列リテラルがネイティブ Unicode として扱われる。Ren'Py 8.x は Python 3.12 ベースで動作するため、ファイル名の文字列処理で Python 2 時代のエンコーディング問題が発生しなくなった。
つまり、Ren'Py が日本語ファイル名をサポートしたわけではなく、Python 3 が Unicode をネイティブに扱うようになった結果、自然に通るようになった ということだ。
なぜ危ないのか:配布で壊れる3つのケース
開発マシンで動くのと、プレイヤーの環境で動くのは別の話だ。日本語ファイル名は、配布プロセスで3つの地雷を踏む可能性がある。
ケース1: macOS の Unicode 正規化問題
macOS の旧ファイルシステム HFS+ は、ファイル名を NFD(分解形) で保存する。一方、Windows や Linux は通常 NFC(合成形) を使う。
例えば「が」という文字は、内部的に2つの表現がある。
| 形式 | 表現 | 説明 |
|---|---|---|
| NFC | が(1文字) | 合成形。Windows/Linux の標準 |
| NFD | か + ゙(2文字) | 分解形。macOS HFS+ の標準 |
ZIPファイルにNFCで格納された 戦闘BGM.ogg を macOS で展開すると、ファイルシステム上はNFDの 戦闘BGM.ogg になる。Ren'Py がNFCで検索すると、ファイルが見つからない。
実際に、商用 Ren'Py ゲーム「WORLD END ECONOMiCA」で日本語ファイル名 飛び_右下.png が macOS で読めないという問題が 報告されている。
ケース2: ZIP ファイル名の文字化け
Ren'Py のビルドは ZIP や tar.bz2 で配布ファイルを生成する。ZIP 形式には ファイル名のエンコーディング標準がない。
Python 3 の zipfile モジュールは UTF-8 フラグ(ビット11)を設定して格納するが、古い解凍ツールや Windows エクスプローラーの一部バージョンはこのフラグを無視する。結果として、日本語ファイル名が文字化けしてゲームが起動しない。
ケース3: Web / Android ビルドの未検証
Ren'Py は Web ブラウザ向けビルド(Emscripten / WebAssembly)と Android APK ビルドをサポートしている。しかし、これらのプラットフォームで日本語ファイル名が正しく動作するという公式の確認はない。Web ビルドでは HTTP の URL エンコーディングとの相互作用も懸念される。
安全な代替:ASCIIファイル名 + エイリアス
ファイル名は ASCII で統一し、スクリプト上の可読性は define エイリアスで確保するのが最も安全だ。
音声ファイル
# audio/ ディレクトリのファイル名は ASCII
# audio/battle_bgm.ogg
# audio/village_theme.ogg
# audio/rain_ambient.ogg
define audio.battle_bgm = "audio/battle_bgm.ogg"
define audio.village_theme = "audio/village_theme.ogg"
define audio.rain_ambient = "audio/rain_ambient.ogg"
label start:
play music battle_bgm
play sound rain_ambient
define で audio 名前空間にエイリアスを作ると、play music 文でファイルパスを書く必要がなくなる。変数名を見れば何の音声かわかるので、可読性も問題ない。
画像ファイル
Ren'Py の画像自動検出は、ファイル名のスペース区切りを画像名にマッピングする(画像表示の公式ドキュメント)。
images/
├── bg forest.png → scene bg forest
├── bg castle.png → scene bg castle
├── eileen happy.png → show eileen happy
└── eileen sad.png → show eileen sad
手動で定義する場合も ASCII で統一する。
image bg forest = "images/bg_forest.png"
image bg castle = "images/bg_castle.png"
命名規約
プロジェクト全体で以下のルールを決めておくと、ファイルが増えても管理しやすい。
# 音声
audio/{種類}_{説明}.ogg
audio/bgm_battle.ogg
audio/sfx_sword_slash.ogg
audio/amb_rain.ogg
# 背景
images/bg {場所}.png
images/bg forest.png
images/bg castle.png
# キャラクター
images/{名前} {表情}.png
images/eileen happy.png
images/eileen angry.png
まとめ
- 動くか? — Ren'Py 8.5.2 では日本語ファイル名は動作する
- なぜ? — Python 3 のネイティブ Unicode 処理のおかげ。Ren'Py の公式機能ではない
- リスク — macOS NFD正規化、ZIPの文字化け、Web/Android未検証。配布後に壊れる可能性がある
- 推奨 — ASCII ファイル名 +
defineエイリアスが安全で実用的
Ren'Py の基本については 入門ガイド を、ステータス管理の設計パターンについては ステータス管理ガイド を参照してほしい。
公式リソース:
- Ren'Py公式ドキュメント — 全機能のリファレンス
- 画像の表示 — 画像の自動検出と命名規則
- Audio — 音声再生の公式リファレンス
- r/RenPy — コミュニティ