9月17日(水)にSteamでリリースされたアドベンチャーゲーム『雑音系少年少女』。
同作はUnityと「Naninovel」を使って開発しつつ、多言語対応も行われています。本記事では、開発の核となったNaninovelの魅力や多言語対応のポイントについて、同作のディレクターであるMYU氏(@myu060309)に解説していただきます。
9月17日(水)にSteamでリリースされたアドベンチャーゲーム『雑音系少年少女』。
同作はUnityと「Naninovel」を使って開発しつつ、多言語対応も行われています。本記事では、開発の核となったNaninovelの魅力や多言語対応のポイントについて、同作のディレクターであるMYU氏(@myu060309)に解説していただきます。
TEXT / MYU
EDIT / 藤縄 優佑
ゲーム会社のダンクハーツに所属しているMYUです。このたびリリースした『雑音系少年少女』は、“トラウマ”や“心のノイズ”と向き合う少年少女たちを描いたマルチエンディング型のアドベンチャーゲームです。
プレイヤーは閉ざされた世界を探索し、登場人物たちの過去や秘密を紐解きながら、彼らが抱える「ノイズ」を一緒に乗り越えていきます。重厚な物語とキャラクター同士の関係性を楽しみつつ、選択肢によって結末が変化する点が本作の特徴です。
※ ボイスはPVでのみ使用し、ゲーム本編には収録されていない
僕らの作品を海外のユーザーさんにも楽しんでもらうため、開発の早い段階から多言語対応を意識していました。翻訳作業そのものも大変ですが、ゲームエンジン(本作の場合はUnity)にどのようにして実装するか、作業効率をどう保つかも頭を悩ませるポイントです。
今回、そのような問題を解決するために利用したのがNaninovelです。本ツールの魅力をはじめ、多言語対応の方法などをここで紹介します。
なお、本記事で使用した環境はWindows 11 Pro、Unity 2021.3.30f1、Naninovel v1.18 build 2023-04-08です。
Naninovelは、Unity向けのビジュアルノベル制作専用ツールです。
シーン進行・UI・セーブ/ロード・スキップ機能・多言語対応など、ノベルゲームに必要な機能を一通り揃えているうえ、独自のスクリプト記法やC# APIを使った開発も可能です。
(画像はUnityアセットストアより引用)
Naninovelのメリット・デメリットは、以下の通りです。
メリット
デメリット
『雑音系少年少女』は、日本語・英語・簡体字・繁体字でのリリースを想定していたのもあり、Naninovelの導入を決めました。Naninovelの多言語自動切換機能および翻訳ファイルの管理のしやすさは翻訳チームと連携しやすく、ファイルの差し替えも簡単でした。
作品の核となる謎解き・会話パートを迅速に構築できる点も大きな魅力でした。演出調整も容易で、立ち絵や背景差し替え、画面エフェクト、BGM切り替えといった要素をスクリプト1行で記述できるため、Unity単独で開発するよりも開発効率が大幅に向上しました。
Naninovelは基本的なADVから外れた機能や演出は自分で実装する必要がありますが、『雑音系少年少女』特有の「グリッチ」「画面揺れ」「色反転」といった特殊演出を、Unityの機能と組み合わせやすいのは強みです。
ほかのツールでも不可能ではありませんが、NaninovelはスクリプトからUnityオブジェクトを呼び出しやすく、演出の自由度が高く感じました。
また、将来的に探索パートやミニゲームなどADV以外の要素を追加しやすいのもNaninovelを採用した理由のひとつです。
「まずはADVとして完成させる」→「必要に応じて発展させる」という長期的な展望においても、Naninovelは柔軟に対応できると判断しました。
ここからは、Naninovel上で「Localization」と呼ばれる多言語対応機能の使い方や注意点をご紹介します。
この機能を使うと、スクリプトファイル(.nani)内の各行に「Text ID(ハッシュ値によって生成される一意のID)」が自動で付与されます。また、このIDと原文のテキストが紐づいた状態で格納された「ローカライズファイル」も生成してくれます。
翻訳担当者は、このローカライズファイルに、対応する言語の翻訳テキストを記述するだけで済みます。つまり、作業の分担やファイルの管理がしやすくなっているシステムといえます。
ゲーム実行時にはユーザーが言語設定を切り替えるだけで、翻訳されたテキストが自動で表示されるのもうれしいところ。
本機能はいきなり使えるわけではなく、手動での準備が必要です。
まず、先に説明した「ローカライズファイル」の保存場所を作成しておきます。
例えば「Resources/Naninovel/Localization」のように、「Localization」フォルダを作りましょう。
「Localization」フォルダ以下は、翻訳対象の言語ごとのフォルダを作成します。フォルダ名は、RFC 5646に準拠した言語タグで命名しましょう。例えば、日本語なら「ja」、英語なら「en」、中国語なら「zh」のフォルダを用意します。
なお、プロジェクトの原文を日本語で用意しているなら「ja」フォルダは不要です。
次に、UIやキャラクター名などの静的テキストを一括で管理・翻訳するドキュメント「Managed Text」を保存するフォルダも作成しておきます。Naninovelとして推奨されている保存先は「Resources/Naninovel/Text」です。
その後、Unityエディタの「Naninovel」→「Tools」→「Managed Text」を選択し、ウィンドウを表示します。
ウィンドウ内では、先に作ったManaged Textの保存フォルダ(例では「Resources/Naninovel/Text」)を指定し、「Generate Managed Text Documents」ボタンを押下します。
これで、指定フォルダにManaged Textのドキュメントが自動作成されます。
プロジェクトの原文が属する言語を「Source Locale」で、ゲーム初回起動時に自動で選択される言語を「Default Locale」で設定します。
これらの設定は、Unityエディタの上部メニューにある「Edit」→「Project Settings」→「Naninovel」→「Localization」からアクセス可能です。どちらも「Japanese(ja)」に変更しましょう。
以上で、事前準備は完了です。
次のステップとして、ローカライズファイルの生成を行います。Unityエディタの上部メニューから「Naninovel」→「Tools」→「Localization」を選択し、表示されるウィンドウで以下のように設定します。
設定を終え、「Generate Localization Resources」ボタンを押下するとローカライズファイルが生成されます。
各言語のフォルダ(「Resources/Naninovel/Localization/en/Script」など)を確認すると、翻訳対象の.txtファイル(ローカライズファイル)が生成されていることがわかります。
上記の例の通り、
# Text ID
; 原文
空欄
の塊がいくつも作られます。
翻訳担当者は空欄部分に、対応する翻訳テキストを記入します。基本的にはそれだけで翻訳は完了です。
僕たちがハマったポイントなのですが、原文で複数箇所に同じセリフを使っているときは注意しましょう。
というのも、Text IDはハッシュ関数を使って値が振られるため、元の入力データ(原文)が同じなら出力データ(Text ID)も同じものが割り振られてしまうのです。
NaninovelはText IDをキーとして翻訳テキストを紐づけるため、Text IDごとに訳文は1つしか読み込まれません。
これの何が問題なのか。
例として、以下のケースで考えてみましょう。
例1:(純粋な感謝)
例2:(皮肉・嫌味)
このように、原文は同じ「ありがとうございます」でも、前後の文脈によって意味やニュアンスが変わってくるため、状況を理解しながら訳さなければいけません。
しかし、Naninovelは同じセリフには同じハッシュ値を振るため、文脈に応じた翻訳はできません。上記の例では、どんな状況でも「ありがとうございます」は「Thank you」と、統一された訳文にせざるを得ないのです。
なお、同じText IDが複数回登場し、それぞれ別の翻訳テキストを記述している場合は、最後に記述された翻訳テキストが適用されます。
この問題へ対処するため、僕たちは「ありがとうございます!」「ありがとうございます…」など、セリフに記号を加えるなどして、別のハッシュ値が変わるように工夫しました。どうしてもそうした工夫ができない箇所については、訳文を調整して対応しています。
ちなみに、Naninovelで生成されるローカライズファイルは、「UTF-8」形式で保存されます。多言語対応において文字化けを防ぐためにも、UTF-8形式を崩さずに扱うようにしましょう。
最後に、ゲーム初回起動時に自動で選択される言語を「Default Locale」で変更してみて、各言語が翻訳されているか確認してみましょう。先に説明した「Default Locale」の設定方法以外でも、Unityエディタで「Tools」→「NaninovelLocalization」→「DefaultLocale」を選択後、設定した言語を選ぶことでも言語の切り替えが可能です。
簡単ではありますが、Naninovelにおける多言語対応の方法を説明しました。Naninovelは英語のみですがガイドが用意されているので、最新バージョンでの情報はそちらをチェックしてみてください。
ローカライズは単なる翻訳作業ではなく、ゲーム全体の設計やワークフローにも深く関わってきます。Naninovelの多言語対応機能を使うことで、スクリプトの切り替えや翻訳の管理がスムーズになり、少人数のチームでも対応できました。
ただ、『雑音系少年少女』ではADVパートのテキストだけでなく、探索パートでクリックしたオブジェクト名やインタラクションの説明といった、UIやゲームプレイ中に動的に表示される要素もすべて翻訳の対象とする必要がありました。
これらはNaninovelの機能だけでは対応しきれず、ゲーム独自の翻訳管理システムを追加実装しました。
具体的には、選択肢が表示されている状態でセーブ→言語変更→ロードした際に、選択肢テキストが正しく翻訳されるよう、ロード時に翻訳テキストを再適用する仕組みを新規で構築しています。
また、Naninovelが想定していないデータ構造やタイミングでテキストを差し込むシーンもあったため、標準機能をそのまま使うだけでは実現できないことも多くありました。
本作はADVとして独特なシステムを多く搭載している事情はありますが、ツールはあくまで効率向上のための手段であり、ゲーム仕様に合わせたカスタマイズや対応が必須であると改めて実感しています。
そうした点を加味しても、『雑音系少年少女』の開発においてはNaninovelはなくてはならない存在であり、多言語対応のUnity製ADVを作ろうとしている方にはオススメのツールです。僕たちと同じようにローカライズや多言語対応で悩んでいる開発者さんにとって、本記事が少しでもヒントになればうれしいです。
『雑音系少年少女』公式サイト「Naninovel」公式サイトディレクター/イラストレーター/キャラクターデザイナー。
『雑音系少年少女』企画立案、キャラクターデザイン、シナリオ、アニメ制作などなど。
『ヒーロー’sパーク』キャラクターデザイン、世界観デザイン、アートディレクション担当。
『ラクガキジャンプ』ジャンプアプリコンテスト大賞、企画制作。
西川善司が語る“ゲームの仕組み”の記事をまとめました。
Blenderを初めて使う人に向けたチュートリアル記事。モデル制作からUE5へのインポートまで幅広く解説。
アークライトの野澤 邦仁(のざわ くにひと)氏が、ボードゲームの企画から制作・出展方法まで解説。
ゲーム制作の定番ツールやイベント情報をまとめました。
ゲームメーカーズ スクランブル2025で行われた講演のアーカイブ動画・スライドをまとめました。
GAME CREATORS CONFERENCE ’25で行われた講演レポートをまとめました。
GDC 2025で行われた講演レポートをまとめました。
UNREAL FEST 2024で行われた講演レポートやインタビューをまとめました。
東京ゲームショウ2024で展示された作品のプレイレポートやインタビューをまとめました。
CEDEC2024で行われた講演レポートをまとめました。
BitSummitで展示された作品のプレイレポートをまとめました。
ゲームメーカーズ スクランブル2024で行われた講演のアーカイブ動画・スライドをまとめました。
CEDEC2023で行われた講演レポートをまとめました。
東京ゲームショウ2023で展示された作品のプレイレポートやインタビューをまとめました。
UNREAL FEST 2023で行われた講演レポートをまとめました。
BitSummitで展示された作品のプレイレポートをまとめました。
ゲームメーカーズ スクランブルで行われた講演のアーカイブ動画・スライドをまとめました。
UNREAL FEST 2022で行われた講演レポートやインタビューをまとめました。
CEDEC2022で行われた講演レポートをまとめました。