リソースプロバイダー
リソースプロバイダーは、メモリ管理 の要件に応じて、実行時にNaninovel関連のアセット(外観テクスチャ、BGMクリップなど)を取得します。各プロバイダーは、特定のソース(プロジェクトの「Resources」フォルダー、UnityのAddressable Asset System、ローカルファイルストレージなど)からのアセットの取得に特化しています。
プロバイダーの全般的な動作は、Naninovel -> Configuration -> Resource Provider メニューで構成できます。
Resource Policy プロパティは、スクリプト実行中にリソースをいつロードおよびアンロードするかを決定します。詳細については、メモリ管理 ガイドを参照してください。
Enable Build Processing は、ビルド前処理を有効にします。この処理は、エディターメニューで割り当てたアセットをビルドでも確実に使用できるようにするために必要です。カスタムビルド環境 を使用している場合や、独自のビルドフックを追加している場合は、この処理を無効にする必要があるかもしれません。プロパティの有効・無効を切り替えた後は、Unityエディターを再起動して変更を反映してください。
Addressablesシステム がインストールされている場合、アセット処理ステップの最適化に使用され、ビルド時間が短縮されます。Auto Build Bundles を有効にすると、ゲームのビルド時にアセットバンドルが自動的にコンパイルされます。
構成メニューのその他のプロパティはプロバイダー固有であり、以下で説明します。
リソース固有のプロバイダーの動作は、対応する構成メニューにある Loader プロパティで構成されます。たとえば、以下はSFXリソースの取得に使用されるデフォルトのローダー構成です。
Path Prefix プロパティを使用すると、特定の種類のリソースに対して、プロバイダーのルートパスに続く追加のパスを指定できます。たとえば、プロジェクトの「Resources」フォルダーから「Explosion」オーディオファイルを取得し、パスプレフィックスを SFX に設定する場合、結果のリソースリクエストは Resources.LoadAsync("Naninovel/SFX/Explosion") になります。
Providers List では、使用するプロバイダーの種類とその順序を指定できます。たとえば、上記の構成では、オーディオリソースをリクエストするときに、Addressableプロバイダーが最初に試行されます。リクエストされたリソースが見つからない場合は、プロジェクトプロバイダーがフォールバックとして使用されます。
エディター内では、特別な「Editor」リソースプロバイダーが常に最初に使用されることに注意してください(ローダー構成に関係なく)。このプロバイダーは、Naninovelの構成およびリソースマネージャーメニュー(Naninovel -> Resources -> ...)を介して割り当てられたすべてのリソースにアクセスできます。ゲームがビルドされると、このようなリソースは自動的に一時的な「Resources」フォルダーにコピーされるか、(Addressablesシステム がインストールされている場合)Addressables構成に登録され、アセットバンドルにコンパイルされます。プロバイダー関連のテストは、Unityエディターではなく、常にビルドで実行することを忘れないでください。
Addressable
Addressable Asset System は、「アドレス」によってアセットをロードできるUnityパッケージです。非同期ロードを使用することで、任意の依存関係のコレクションを伴う、任意の場所(ローカルストレージ、リモートWebホスティングなど)からのロードをサポートします。システムのセットアップ、構成、使用方法については、Unityのドキュメントを参照してください。
パッケージがプロジェクトにインストールされている場合、Naninovelは自動的にAddressablesを使用します。追加のセットアップは必要ありません。Naninovelの構成メニューで割り当てられたすべてのアセット(シナリオスクリプト、キャラクタースプライト、オーディオクリップなど)は、ゲームのビルド時にシステムに登録されます(アドレスが割り当てられます)。
Naninovelメニューで割り当てたアセットは、Naninovel グループに追加されます。アセットの配信方法を構成する場合(たとえば、リモートWebホストを指定する場合)は、Window -> Asset Management -> Addressables -> Groups からこのグループを編集します。このグループは最初に必要になった時点で自動的に作成されますが、ゲームをビルドする前に構成する場合は手動で作成することもできます。
注意
Naninovelメニューで割り当てたアセットのアドレスは、ビルドごとに自動的に生成または更新されます。アドレスを手動で編集しないでください。変更は次のビルドで失われる可能性があります。ただし、グループ設定は保持されます。
手動割り当て
エディターメニューを使用せずにAddressableアセットをNaninovelリソースとして登録するには、アドレスに Naninovel/ プレフィックスを追加し、その後にリソースタイプ(パスプレフィックス)とローカルリソースパスを続けます。アドレスにファイル拡張子を含めないでください。アセットはどのAddressablesグループに属していても構いません。Naninovelはアドレスによってアセットを識別します。
以下は、一般的なリソースタイプを手動で割り当てる際に使用できるアドレスの例です。
| リソースタイプ | アドレス |
|---|---|
| シナリオスクリプト | Naninovel/Scripts/{SCRIPT_PATH} |
| スプライトキャラクターの外観 | Naninovel/Characters/{CHARACTER_ID}/{APPEARANCE_PATH} |
| 汎用キャラクター | Naninovel/Characters/{CHARACTER_ID} |
| 背景音楽 | Naninovel/BGM/{AUDIO_PATH} |
| 効果音 | Naninovel/SFX/{AUDIO_PATH} |
| ボイス | Naninovel/Voice/{AUDIO_PATH} |
| 管理テキストドキュメント | Naninovel/Text/{DOCUMENT_PATH} |
| スクリプトローカライズドキュメント | Naninovel/Localization/{L10N_TAG}/Text/Scripts/{SCRIPT_PATH} |
例
Addressableプロバイダーを介して(リソースエディターメニューを使用せずに)Naninovelリソースを手動で登録し、リモートホストからアセットを配信する方法の例については、Addressableサンプル を確認してください。Unityの 学習教材 も役立つ場合があります。
スクリプトラベル
残念なUnityの設計上の決定 により、Addressableアセットは、アセットバンドル全体がアンロードされるまでメモリからアンロードされません。つまり、バンドルを適切に整理しない限り、アセットが単一のバンドルにまとめられ、一度ロードされると二度とアンロードされず、メモリ不足例外が発生する可能性があります。
最も簡単な解決策は、グループ設定 で Bundle Mode を Pack Separately に設定することです。
これにより、各アセットが個別のバンドルに格納され、解放されるとすぐにアンロードできるようになります。RAM使用量を抑えるには最適ですが、CPUオーバーヘッドとロード時間は増加します。特に低速ドライブでは、多数の小さなバイナリBLOBを繰り返しシークしてロードするよりも、1つの大きな連続バイナリBLOBをロードする方がはるかに高速であるためです。
リソースプロバイダー構成で Label By Scripts が有効になっている場合(デフォルト)、Naninovelは折衷案を採用します。ビルドプロセス中にすべてのシナリオスクリプトをスキャンし、各スクリプトに必要なアセットの特定を試み、参照元のスクリプトごとにAddressableアセットにラベルを割り当てます。
Bundle Mode を Pack Together By Label(デフォルト)に設定すると、アセットはシナリオスクリプトとの関連性に基づいてバンドルに分割され、Naninovelの メモリ管理ポリシー 用にバンドル構造が最適化されます。
注意
Addressablesを介して 手動で割り当てられた アセットを含め、すべてのNaninovelアセットはラベル付けの対象となります。アセットのアドレスが Naninovel/ で始まる限り、関連するスクリプトでラベル付けされます。
ラベル付けプロセスにはある程度の推測が必要であり、常に完璧であるとは限りません。アセットが正しくラベル付けされるようにするには、次のガイドラインに従ってください。
- アクターID、外観、オーディオパスなどのリソースコンテキストのパラメーターで 式 を使用しないでください。式はコマンドが実行される直前に評価されるため、ビルド時に最終パスを解決することは不可能です。Naninovelは、ビルド中にそのようなケースを検出すると警告します。
@charや@backなどのコマンドでは、常にアクターIDと外観を指定してください。このようなコマンドはデフォルトにフォールバックする場合がありますが、ビルド時にそれらのデフォルトを解決できるとは限りません。- カスタムコマンド を作成するときは、リソースを参照するパラメーターに リソースコンテキスト属性 を適用してください(たとえば、アクターIDを受け入れるパラメーターに
[ActorContext]を適用します)。これらの属性は主にIDE拡張機能の自動補完に使用されますが、ラベル付けツールもアセットアドレスを解決するために使用します。
Project
プロジェクトプロバイダーは、Unityプロジェクト内の「Resources」フォルダーにあるアセットを提供します。プロジェクトの リソースロードAPI に関する詳細については、Unityのガイドを参照してください。
警告
ほとんどの場合、「Resources」フォルダーの使用は推奨されません。可能な場合はNaninovelリソースマネージャーを介してリソースを割り当てるか、代わりにAddressablesシステムを使用することを検討してください。その後、アセットを「Resources」フォルダーの外に移動することを忘れないでください。
Local
ローカルプロバイダーを使用すると、ローカルファイルシステムの任意の場所から単純なアセット(シナリオスクリプト、スプライトキャラクターと背景、オーディオ)を提供できます。
注意
ローカルプロバイダーはファイルシステムから生のファイルをロードし、実行時に変換します。この処理は低速であり、他のプロバイダーと比較してサポートされるファイルタイプも限られます。開発時または特定の機能(コミュニティMod など)にのみ使用してください。
サポートされているファイル形式:
- シナリオスクリプト用の
.naniプレーンテキストファイル - 画像/テクスチャ用の
.pngおよび.jpg - オーディオ用の
.wav(PCM16 44100Hzステレオのみ)
リソースプロバイダー構成の Local Root Path プロパティは、ローカルリソースが保存されているフォルダーを指す必要があります。絶対パス(例:C:\Resources)または次の起点のいずれかで始まる相対パスを使用できます。
%DATA%— ターゲットデバイス上のゲームデータフォルダー(Application.dataPath)%PDATA%— ターゲットデバイス上の永続データディレクトリ(Application.persistentDataPath)%STREAM%— 「StreamingAssets」フォルダー(Application.streamingAssetsPath)%SPECIAL{F}%— OSの特殊フォルダー。Fは 特殊フォルダーの列挙型 の値の名前です。
デフォルトの %DATA%/Resources 値は、ゲームのデータディレクトリ内の「Resources」フォルダーを指します(正確な場所はターゲットプラットフォームによって異なります)。
使用例の1つとして、シナリオを作成するために共同作業者と共有している C:/Users/Admin/Dropbox/MyGame/Scripts からシナリオスクリプトをロードしたいとします。ルートフォルダーを絶対パス(C:/Users/Admin/Dropbox/MyGame)で指定すると、すべての共同作業者がまったく同じパスにフォルダーを保存する必要があります。代わりに、「UserProfile」という特殊フォルダーを起点とする相対パスを使用します:%SPECIAL{UserProfile}%/Dropbox/MyGame。
スクリプト構成のパスプレフィックスが Scripts に設定されており、ローカルプロバイダーがリストに追加されている場合、スクリプトナビゲーター(nav コンソールコマンドでアクセス可能)は、そのフォルダーの下に保存されているすべての .nani テキストファイルを検出するはずです。
カスタムプロバイダー
リソースプロバイダーのカスタム実装を追加し、Naninovelに組み込みプロバイダーと一緒に(またはその代わりに)使用させることが可能です。
カスタムプロバイダーを追加するには、パラメーターなしのコンストラクターを持つC#クラスを作成し、IResourceProvider インターフェースを実装します。作成すると、カスタムプロバイダータイプが組み込みタイプとともにすべてのローダー構成メニューに表示されます。
Naninovel/Runtime/Resource/Provider パッケージディレクトリに組み込みのリソースプロバイダー実装があります。独自のプロバイダーを実装する際の参考にしてください。
コミュニティMod
コミュニティModを使用すると、プレイヤーはゲームの組み込みリソースを引き続き利用しながら、独自のシナリオやリソースを追加してビルドを改変できます。
機能を有効にするには、スクリプト構成メニュー(Naninovel -> Configuration -> Scripts)で Enable Community Modding プロパティを有効にし、Mod用に公開したいリソースに対して ローカル プロバイダーを設定します。ビルドディレクトリ下のリソースが検索されるように、ローカルプロバイダーのルートパスがデフォルト値(%DATA%/Resources)に設定されていることを確認してください。
機能が有効になると、タイトルメニューに「EXTERNAL SCRIPTS」ボタンが表示され、このボタンで外部スクリプトブラウザーを開けます。エディター内では、ブラウザーにプロジェクトアセットのシナリオスクリプトも一覧表示されます。
External Loader 構成は外部スクリプトブラウザーに表示されるスクリプトを制御するのに対し、Loader 構成は実際のスクリプトリソースのロードを制御することに注意してください。External Loaderはデフォルトでローカルプロバイダーを使用するため、ゲームビルドディレクトリ内のスクリプトのみを検索します。その他のリソースタイプ(背景、キャラクターなど)については、プレイヤーが追加できるように、対応する構成メニューで手動でローカルプロバイダーを設定する必要があります。
外部リソースをビルドに追加するには、ゲームの「Resources」ディレクトリ下にある、Loader フォールドアウトで構成されたリソースの Path Prefix プロパティに対応するサブフォルダーに配置します。たとえば、外部シナリオスクリプトを追加するには GameFolder/GameName_Data/Resources/Scripts に配置し、背景は GameFolder/GameName_Data/Resources/Backgrounds に配置する、といった具合です。GameFolder と GameName は、Unityプロジェクトの名前によって異なります。
外部スクリプトブラウザーUIは、UIのカスタマイズ 機能を使用してカスタマイズまたは完全に置き換えることができます。