Level Streaming Volumes
概要
この文書は、ボリューム ベースのレベル ストリーミングの利用法の概要です。この文書では、読者が 「レベルのストリーミングの手順」 で記述したレベル ストリーミングの基本を理解していることを想定しています。
LevelStreamingVolumeは、レベル ストリーミングの制御をきわめて容易にします。アイデアは単純で、ストリーミング レベルのロード/アンロード要求が、そのレベルに結び付けられた「LevelStreamingVolume」ボリュームの内側にビューポイントがあるかどうかに基づいて行われる、というものです。
具体的には、LevelStreamingVolumeは、次の 2 つの方法で利用できます。
- ゲーム 中では、LevelStreamingVolumeにより、プレーヤーがボリュームの内側にいるときにレベルがロードされ、ボリュームの外側にいるときにレベルがアンロードされます。
- エディタ の中では、LevelStreamingVolumeにより、パースペクティブ ビューポートのカメラの位置に基づいて、自動的にレベルを隠したり表示したりすることにより、レベル ストリーミングのプレビューを表示することができます。
ボリューム ベースのレベル ストリーミングは簡単に利用でき、Kismet スクリプトもまったく必要としないので、レベル ストリーミングを制御する理想的な方法です。その上、ボリューム ベースのレベル ストリーミングは、スクリプトによるストリーミングよりもメンテナンスが容易です。システムのロードに対する需要に変化があった場合には、ストリーミング ボリュームの大きさを変更するだけで、レベルのロード/アンロード動作を変更することができます。
ストリーミング ボリュームをレベルに関連付ける
ボリューム ベースのレベル ストリーミングは、次のように働きます。各ストリーミング レベルは、LevelStreamingVolume型のボリュームの集合に関連付けることができます。エンジンはフレームごとに各レベルを反復して、プレーヤーの視点が、そのレベルに関連付けられたLevelStreamingVolumeの内部にあるかどうかをチェックします。視点がいずれかのLevelStreamingVolumeの内側にある場合には、レベルのロードを開始するためのリクエストが発行されます。視点がどのLevelStreamingVolumeの内側にもない場合は、そのレベルはアンロード対象としてマークされます。
ストリーミング ボリュームをレベルに関連付けるには、
- LevelStreamingVolumeをPersistent レベルに追加します(他のボリュームと同様、エディタのメイン ツールバーの "Add Volume" (ボリュームを追加) ボタンを利用)
- ボリュームに関連付けるレベルを、レベル ブラウザの中で選択して右クリックし、レベル ブラウザのコンテキスト メニューを呼び出して "Add Streaming Volumes" (ストリーミング ボリュームを追加) を選択します。
必要な操作はこれだけです。
レベル ブラウザのコンテキスト メニューに登場するLevelStreamingVolume操作すべてのリストは、以下のようになります。
- Add Streaming Volumes: レベルにボリュームを追加します。既存の関連付けはすべて維持されます。
- Set Streaming Volumes: 選択したボリュームだけをレベルのボリュームに設定します。既存の関連付けはすべて放棄します。
- Clear Streaming Volumes: 選択したレベルとストリーミング ボリュームとの関連付けをすべて削除します。
- Select Associated Streaming Volumes: 選択したレベルに関連付けられたボリュームをすべて選択します。
ストリーミング ボリュームは表示の邪魔になりやすいので、LevelStreamingVolumeは、 1) 可視 でなおかつ 2) 選択中 のレベルにのみ表示されます。したがって、ボリュームを関連付けたレベルの選択を解除すると、そのボリュームがエディタのビューポートから消えるのがわかるはずです。そのレベルを再度選択すれば、レベル ブラウザには関連付けられたボリュームが再表示されます。
重要な詳細
- LevelStreamingVolumeは、すべて、Persistent レベルの中にある必要があります。それ以外のレベルにあるLevelStreamingVolumeは、レベル ストリーミングに利用することはできず、マップに対するエラーのチェックを行うと、警告が生成されます。
- ボリューム ベースのレベル ストリーミングを利用できるのは、Kismet ストリーミング方式を使ったワールドに追加されたレベルだけです。
- レベルに何らかのストリーミング ボリュームが関連付けられている場合、そのレベルに対する他のストリーミング方式(距離ストリーミングや Kismet ストリーミングなど)は正しく動作しません。
- 単一のLevelStreamingVolumeが、複数のレベルに影響を与えることが可能です。同様に、単一のレベルが、複数のLevelStreamingVolumeの影響を受けることも可能です。
- ボリューム ベースのストリーミングは、分割画面でも動作します。ロード/アンロードのリクエストが発行されるときには、ローカルなプレーヤー全員の視点が考慮されます。
ストリーミング ボリューム設定のテスト
ボリューム ベースのレベル ストリーミングを、ターゲット プラットホーム上で動作するゲームの中でテストすることは重要です。"Play In Editor (PIE)" の中でストリーミングを行うと、ロードやアンロードが起きる場所はわかりますが、 PIE 中のストリーミングでは、実際のゲーム中でのロードやアンロードと同じことが起きるわけではありません。 なぜなら、PIE の中では、レベルがメモリ内に常駐しているので、レベルを「ロード」するには単に再表示すればよく、一瞬で可能だからです。
ターゲット プラットホーム上のスタンドアローンのゲームの中でレベルを実行することは、ストリーミング設定が機能することを確認するために不可欠です。プラットホームの中には、レベルのストリーミングに数秒を要するものもあるので注意してください。プレーヤーがそのレベルに達するまでの間にレベルがロードされるように、LevelStreamingVolumeの大きさを調節してください。レベルのロード動作は、レベルに関連付けられたLevelStreamingVolumeの大きさを変更することによって、調節できます。ボリュームを大きくすると、関連付けられたレベルのロードは早く、アンロードは遅くなります。逆に、ボリュームを小さくすると、ロードは遅く、アンロードは早くなります。
Previs 用のLevelStreamingVolume
ボリューム ベースのレベル ストリーミングは、パースペクティブ ビューポート ツールバー上の [Previs 用のLevelStreamingVolume] (Level Streaming Volume Previs) ボタンを有効にすれば、簡単にプレビューすることができます。このモードを有効にすると、レベルはパースペクティブ ビューポート カメラの位置に基いて非表示/再表示されます。この非表示/再表示は、レベル ブラウザ中に表示されるレベルのセットに影響することに注意してください。
LevelStreamingVolumeは、bEditorPreVisOnly フラグを設定することによってのみ、エディタ Previs 用にマークすることができます。このようにすれば、ゲーム中のストリーミングには別のストリーミング方式を利用していても、エディタ Previs にはボリューム ベースのレベル ストリーミングを利用することができます。
LevelStreamingVolumeのコスト
UWorld::ProcessLevelStreamingVolumes は、フレームごとに各ストリーミング レベルを走査し、各レベルは、そのレベルに関連付けられたボリューム内にローカルなプレーヤーが存在する場合には、レベルのロードを開始します。同様に、どのボリュームの内側にもローカルなプレーヤーが存在しない場合には、アンロードを開始します。
このUWorld:ProcessLevelStreamingVolumes は、コヒーレンスを利用するために、各レベルの、最後にプレーヤーが存在していたボリュームをキャッシュしています。このキャッシュされたボリュームがまず最初にチェックされるので、プレーヤーが存在する、もしくは、戻ってきたレベルは、即座にロードされます。
ボリュームの形状はなんでもかまいませんが、数は少ないほどよいでしょう。LevelStreamingVolumeのコストの上限は、アンロードされたレベルに関連付けられたLevelStreamingVolumeの数の合計によって近似されます。
「Streaming」 統計グループの下には、レベル ストリーミング性能を監視するための統計が2種類あります。「Streaming Volumes」 統計は、プレーヤーの視点に対してテストされたLevelStreamingVolumeのフレームあたりの数を追跡し、「Volume Streaming Tick」 統計は、UWorld::ProcessLevelStreamingVolumes のフレーム当たりの所要時間を追跡します。
アンロード リクエスト履歴の追加
LevelStreamingVolume境界を前後にまたぎながら移動するプレーヤーがいると、不必要なロード/アンロードのリクエストが発行される原因になります。この問題に対処するために、アンロード リクエストに履歴が追加されました。ただし、ロード リクエストの方には履歴はありません。なぜなら、ロードする必要のあるレベルは、常に即座にロードする必要があるからです。
アンロード履歴の量は、レベル ストリーミング オブジェクトの [MinTimeBetweenVolumeUnloadRequests] (ボリュームのアンロード リクエスト間の最小時間) プロパティを変更することによって調整できます。(レベル ストリーミング プロパティは、レベル ブラウザのコンテキスト メニューからアクセスできます)。デフォルトのアンロード履歴の量は、2.0 秒分です。
LevelStreamingVolumeを無効にする
LevelStreamingVolumeには、bDisabled プロパティがあります。このプロパティが TRUE に設定されている場合、そのボリュームは、ゲーム中でもエディタ中でも、ストリーミング ボリュームのコードから無視されます。bDisabled を使うと、LevelStreamingVolumeをレベルから切り離すことなく、無効にすることができます。また、Toggle Kismet アクションを利用すると、ゲーム中に bDisabled をトグルして、レベル ストリーミングの制御を Kismet ストリーミングとボリューム ストリーミングの間で切り替えることができます。 Kismet ストリーミングとボリューム ベースのストリーミングとの間の切り換えは、エラーの原因になり易く危険 なので、使うのは必要なときだけにしてください。
bDisabled フラグが有効な例として、ストリーミング ボリュームでストリーミングが制御されているレベルにつながるドアを考えてみましょう。
上の画像では、プレーヤーは左から接近し、ストリーミングすべきレベルは、ドアの右側になります。ストリーミング ボリュームは、ドアを越えてその左側にまで広がっているので、プレーヤーがドアに到達してドアを開けることができる状態になったときには、対応するレベルがストリーミングされるはずです。けれども、このドアは初期設定では鍵がかかっていて、プレーヤーがマップの別のところで目標を達成した時点で鍵が開くようになっています。したがって、ストリーミング ボリュームがドアを越えて広がっていたとしても、ドアの鍵が開く(開けることが可能になる)までは、ドアの向こう側のレベルはロードしないことが望ましいのです。
これを実現する方法は、エディタの中ではLevelStreamingVolumeを bDisabled にマークし、目標が達成された時点で、Kismet のトグル アクションを使って bDisabled を FALSE に設定することです。これにより、LevelStreamingVolumeは「オン」になり、プレーヤーがドアに接近したときにはレベルがストリーミングされるようになります。
Important!
You are viewing documentation for the Unreal Development Kit (UDK).
If you are looking for the Unreal Engine 4 documentation, please visit the Unreal Engine 4 Documentation site.