UDN
Search public documentation:

LevelStreamingHowToJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > レベルストリーミング > レベルのストリーミングの手順

レベルのストリーミングの手順


概要


ここにご紹介する方法で、Unreal Engine 3 のユーザーは複数レベルの同時ストリーミングの構築を実現し、広大なシームレス ワールドのイリュージョンを作り上げることができます。   ボリュームベースのレベルストリーミングについての情報は レベルストリーミングボリューム の文書をご覧ください。

Persistent レベル


複数のレベルをシームレスにブレンドするという目的への第一のステップは、Persistent レベルの作成です。このレベルは、基本的にはどのレベルをストリーム入出力するかをつかさどるマスター レベルとして考えてよいでしょう。

Persistent レベルの作成とストリーミングレベルをそこに追加する作業は、いくつかの簡単なステップで完了します。:

複数のレベルをシームレスにブレンドするという目的への第一のステップは、Persistent レベルの作成です。このレベルは、基本的にはどのレベルをストリーム入出力するかをつかさどるマスター レベルとして考えてよいでしょう。

Persistent レベルの作成とストリーミングレベルをそこに追加する作業は、いくつかの簡単なステップで完了します。

新規マップを作成し、不可視エリアに小さなジオメトリのキューブを追加します。(エンジンはこのマップをレベルとして扱うためだけにこの作業を行いますが、今後はこの方法は徐々に使わなくなる予定です。)

  1. プレーヤにゲームを開始させたい場所をプレーヤスタート地点として配置します。持続レベルではこのプレーヤスタート地点が空間に浮いていることが多いのですが、一旦レベルをストリーム インすると、最初にストリームされたレベルの中なら、プレーヤにゲームを開始させたい地点はどこへでも移動することができます。ゲームを始める時には持続レベルを起動することになりますが、プレーヤは実は持続レベルではなく、ストリームされたレベルのうちのひとつにあるジオメトリを歩き進むことになります。
  2. マップには、管理しやすいように、例えば「Headquarters_P」などの、持続レベルと分かるような名前をつけて保存しておきます。
  3. Generic ブラウザを開き、[Level] タブをクリックします。ここで、ストリーム インしたいレベルを記載しておく必要があります。「Headquarters」が 3 つのマップで構成される場合、3 つすべてをここに追加します。この作業は、[Level] のプルダウンメニューから、[Level]→[New From File](ファイルから新規) を選択して行います。ストリーミング レベルを追加する順番は重要ではありませんが、 UnrealEd? の今後のバージョンではレベルが整理できるよう順番の並べ替えもサポートする予定です。最終的には下のイメージのような状態で終わるはずです。 レベルのストリーム インには、距離と Kismet の二つの方法があります。距離によるストリーミング入出力は、レベル原点からの距離に基づいて行われます。一方、Kismet によるストリーミングを使うと、デザイナーは Kismet スクリプトを介して、思い通りのレベルの入出力が行えるようになり、この方法がもっともよく使われています。
  4. レベルのストリーム インには、距離と Kismet の 2 つの方法があります。
    • 距離によるストリーミング入出力は、レベル原点からのプレイヤーの距離に基づいて行われます。
    • Kismet のストリーミングは、デザイナーが Kismet スクリプトを介して思い通りのレベルの入出力が行えるので、よく使われる方法です。

streamingImagenew1.jpg

例1: ストリームした 3 つのレベルを追加した後のレベル ブラウザ

‘CURRENT’と表示されているレベルは、エディター ウィンドウまたは Kismet で行われた変更に伴って修正されます。これにより、書込み可能なマップであれば、複数のマップで簡単に作業することができるようになります。例えば保存のボタンを押すと、‘CURRENT’ レベルを保存(もしくは、[Save All Levels](すべてのレベルを保存)のボタンをクリックして持続レベルを含むリスト上の全マップを保存)します。

Visible のチェックボックスでは、エディターでレベルを表示するか非表示にするかを切り替えることができますが、これは視覚上のことだけで、ゲーム実行時にレベルがストリーム インされるかどうかには関係していません。ただし、ここで不可視なレベルについては、レベルのリビルド結果が反映されませんので、複雑なレベルがある場合には不可視にしておくと、大きく時間を節約することができます。

Persistent レベルから、ストリームしたレベルを永久に削除するには、ブラウザのプルダウンメニューにある[level]から[Remove level](ワールドからレベルを削除)を選択します。レベルのストリーム方法を変更したい場合は、一旦レベルを削除して再追加し、採用したいストリーム方法を選択します。現在のところ、[Load] と [Unload]、[Lock/Unlock](ロック/アンロック) のアイコン、そして[Draw Bounding Box](境界ボックスを描画する)フラグは作動しません。

streamingImagenew2.jpg

streamingImagenew2.jpg

例2: 右クリックから、[Make Current](現在のレベルを作成)を選択して作業中のレベルへ移動

Persistentレベルの作成方法

  • UnrealEd? で新規マップを作成
  • 立方体など、単純な形状の BSP ジオメトリを追加
  • プレーヤスタート地点を追加
  • レベルブラウザにストリームしたいレベルを追加
  • マップを保存して命名

Kismet でのスクリプト済みストリーミングの方法


上記の手順で持続レベルを作成できたら、ゲームにストリームしたいレベルの選択準備は完了です。この作業は二段階に分かれます。ひとつはレベルのストリーミング(ローディング)、もうひとつはレベルの可視化です。Kismet によりレベルをストリームする場合は、次の手順どおりに作業を進めて下さい。:

  • Kismet を開く
  • レベルをスタートアップに設定([New Event](新しいイベント) → [Level Loaded](レベルのロード))
  • 存在するレベルの数だけ[Stream Level](レベル ストリーム)を実行([New Action](新しい操作)→[レベル]→[Stream Level](レベル ストリーム))
  • [Stream Level](レベル ストリーム)の各操作をクリックして、LevelName ([レベル名) と表示されたところにレベル名を入力して、対応するレベルを追加する。
  • [Stream Level](レベル ストリーム)の各操作への[Load](ロード) とレベルのロードを接続

この手順を完了すると、持続マップを実行するとすぐに接続された各レベルがロードされるようになります。ここで覚えておきたいことは、プレーヤがゲームのワールドに入ってきた直後から表示したいマップがある場合は、レベルをロード直後から可視状態にするオプション設定(bMakeVisibleAfterLoad)が用意されていることです。また、ストリームしたセクションをロード直後から可視にする bShouldBlockOnLoad についても確認しておくとよいでしょう。

streamingImagenew3.jpg

例3: Kismet で 3 つのレベルをロード

ここで、ロード時に可視と設定しておけば、持続レベルを起動してストリーミング レベルを検査できるはずです。パフォーマンス上の理由で可視と設定しなかったレベルがある場合は、トリガの設定かその他の方法により可視にします。例えば、Headquarters_3 は開始時にプレーヤが見るにはあまりにも遠いので、リソースを他のものに使うために後で可視にすることにします。Kismet には[New Action](新しい操作)→[Level] に[Change Level Visibility](レベルの可視性を変更)という機能があります。この操作によりストリームしたレベルの表示と非表示を任意に切り替えることができます。Stream Level の操作で Unload のイベントを使った場合、レベルはメモリからアンロードされます。これはメモリを開放するという利点がある反面、可視にしたい時に Load イベントを使用しておく必要があります。

スクリプト済みストリーミングの手順リスト

  • Kismet を開く
  • LevelLoaded (レベルのロード) および StreamLevel (レベル ストリーム) の操作を追加し、スタートアップを Load に接続
  • Stream Level(レベル ストリーム)で左クリックし、[LevelName] (レベル名) のフィールドにストリームしたいレベルの名前を追加し、bMakeVisibleAfterLoad フラグをチェック
  • マップを保存しゲームを起動

距離ベースによるストリーミング


プレーヤからの距離に基づいてストリームするレベルを選択する場合は、いくつかの追加作業があります。まず、持続レベルがGeneric ブラウザで選択されていることを確認し、WorldInfo (ワールドの情報) のカテゴリーを右端で展開します。WorldInfo_# で右クリックすると、[Edit Properties](プロパティの編集) が表示されるので選択します。プロパティウィンドウから WorldInfo のプロパティを開いて、[StreamingLevels] (ストリーミング レベル) のプロパティを開きます。すると、各ストリーミング レベルのリストが表示されます。[MaxDistance] (最大距離) のフィールドに、レベルをストリーム インするプレーヤからの距離を設定することができます。ここで指定された距離は、デフォルトでレベルのワールド スペースに座標(0, 0, 0)を中心とした球体範囲と考えて下さい。プレーヤがこの球体に進入すると、レベルはストリーム インされ、球体を離れるとレベルがアンロードされます。この球体の場所は変更可能ですが、通常この球体でストリーミングするレベルの全体を包括する必要があるので、実際は移動が必要な場合がほとんどです。したがって、レベルに近くなるとロードし、レベルの周辺を離れるとアンロードします。まだサポートされてはいませんが、この球体の在処を表示する機能を追加する予定です。

このストリーミング方法は、レベルからのプレーヤの距離に基づいて、レベルのロードおよびアンロードを何度も行う必要がある場合に便利です。レベルは表示と非表示を切り替えるのではなくストリーム入出力を行うため、マップが大きい場合など、レベルのロードにはかなりの時間がかかる場合がありますのでご注意下さい。

streamingImagenew4.jpg

例4: 距離に基づくストリーミングの設定

距離によるストリーミングの手順リスト

  • "Generic Browser" を開く
  • "Level" (レベル) のタブをクリック
  • Generic ブラウザのファイルメニューから[Level]→[New From File](ファイルから新規作成) を選択し、ストリーム インしたいレベルを選択
  • "Distance" ストリーミングを選択
  • "Persistent Level" が選択状態であることを確認し、右端に WorldInfo のプロパティを展開。WorldInfo_# で右クリックして "Edit Properties" を選択
  • 開いているプロパティ メニューで、WorldInfo に続いて StreamingLevels を展開
  • レベルをワールドにストリーム インする、ゲーム内におけるプレーヤからの距離を入力し、この距離を測定する原点となるワールド スペースの座標位置を変更します。

ストリームしたレベルを操作する


ローディングおよびイベント

通常レベルがロードされた時に多くのイベントを展開させる "Level Startup" (レベル スタートアップ) の操作に代わり、新しいKismetの操作が追加されました。この操作は "Level Loaded And Visible" (レベルをロードして可視にする) という名の機能です。基本的には "Level Startup" と同様の働きをしますが、 "Change Level Visibility" (レベルの可視性を変更) の操作と併用するように作られています。レベルがプレーヤに可視になっているときは、CLV とストリーム インのいずれの方法でも、[bMakeVisibleAfterLoad] (ロード後可視にする) がチェックされていれば、 "Loaded And Visible" (ロードして可視にする) が発動されます。 "Remote Events" (リモート イベント) と一緒に使うことにより、ストリームしたレベルを、イベントの授受のほか、ロードおよびアンロードも必要に応じて行うことができる、自己完結のエンティティとすることができます。例えば下のイメージでは、主題となるレベルが可視になると共にプレーヤがテレポートし、他のレベルからリモート イベントが発動されると何らかの生物のスポーンも行います。

streamingImagenew5.jpg

例5: ストリーム レベルのサンプル スクリプト

アクタのレベル間の移動

2007 年 12 月 QA 承認済みビルドの時点で、アクタを単純に 1 つのレベルからコピー (Ctrl + C) して、現在のレベルを変更し、貼り付ける (Ctrl + V) だけで、アクタのレベル間移動ができるようになりました。しかしながら、これは MoveSelectedActorsToCurrentLevel のものと似たようなパスウェイを使用するので、アクタ間の潜在的なリファレンスを解決するためには、アクタを スクラッチ ワールドに直列化しなければいけません。この機能は変更リスト #203995 と #206418 で導入されました。

2007 年 1 月 QA 承認済みビルド以前のビルドでは、一度にたくさんのアクタを移動させた場合は、 メモリ不足 が起こったかも知れませんが、これはエディタ トランザクション バッファのパフォーマンス (とメモリ使用量) を修正した際に修正されました (変更リスト #206829)。

また、2007 年 1 月 QA 承認ビルドでは、 レベル ブラウザ参照 内の [New Level from Selected Actors] (選択されたアクタから新しいレベル) ボタンで、アクタを新しいレベルへ移動することができます (変更リスト #206324)。

最適化

ほとんどのデベロッパーは、パフォーマンスやワークフローのためには、ストリーミング レベルが高ければ高いほど良いと感じるはずです。しかしながら、これは現在システムにある制限要因で調節されるはずです。すなわち、一つのレベルに設置されたアクタは、他のレベルにより kismet 内で直接リファレンスされることができません。遠隔イベントは、ストリーミング レベル全体でイベントをトリガするために発動され、受信されますが、この時点ではレベル全体でアクタを直接することはできません。上記の写真では、Pathnode_0 と Pathnode_1 はこのスクリプトと同じレベルに位置していなければならず、この場合では Headquarters_2 です。もし、これらどちらかのノードが HQ_1 または 3 にあった場合は、これらの操作は機能しません。

2007 年 12 月 QA 承認済みビルド以降、既存のレベルをストリーミング チャンクにより簡単に分ける機能があります。

  • ワールド内でたくさんのアクタを選択します。
  • レベル ブラウザの Level (レベル) にある New Level from Selected Actors (選択されたアクタから新しいレベル) を選択します。
  • 新しいストリーミング レベルがディスクに作成され、ワールドに追加されます。その後、選択されたアクタは新しいレベルに移動されます。

これにより、より小さなストリーミング レベル セクションを作成するのが容易になります。

ボリュームのストリーミング


ボリューム ベースのレベル ストリーミングに関する情報は、 レベル ストリーミング ボリューム ページを参照してください。

まとめ


以上がゲーム ワールドにレベルを同時ストリーム入出力する方法の概要です。多くの新しい機能や更新中の機能があるため、機能や作業の単純化などが追加されるごとに本文を定期的にオンラインで更新する予定です。