UnrealEngineで一つのレベルに要素を全部詰め込むのは違法だと祖父に教えられました
こんちわ~、UE5でホラゲーを開発している「さんきゅっぱ」です~
まず、タイトルについて謝らせてください。もちろん違法ではありません。
不安を煽るような事を書いてしまい申し訳ありません。
祖父に言われたわけでもないです申し訳ありません。
今回はプロの開発現場では当たり前に行われている「レベルの分割」について、記事にしてみました。
僕も現在、絶賛ホラゲー開発中で、その中でも今回紹介する方法を使用しています。
レベルを適切に分けておくことで、圧倒的に管理しやすいですし、精神衛生的にもメリットがあります。また複数人での作業を想定している場合は、これをやっておかないとかなり進めづらいと思いますので、そういった作業分担に困っている方の役に立てれば幸いです。
ただし、「これが正解」というわけではないと思っているので、改善点などあればぜひ教えていただけると助かります。
対象読者👤
- レベルって何?って人
- レベルってどんな風に分けるの?って人
- 「ほほう、小童がなんか言っとるわ。見てやるか」って人
宣伝📣
📝 開発の進捗、ちょこちょこ報告してます
現在はUE5でホラーゲームを作っています。
- 「開発の裏側を見てみたい」
- 「どんな感じのゲーム?」
など気になったら、ぜひ覗いてみてください~。
フォローやいいねもらえると、めちゃくちゃ喜びます🙌
レベルの概念🏡
Persistant LevelとSubLevelについて
UEでは、レベルを管理する方法として「Persistent Level」と「SubLevel」の概念があります。
-
Persistent Level(パーシステントレベル)
- ゲームのメインとなるレベル。
- すべてのSubLevelの親となる。
- 必ず1つのレベルが存在する。
-
SubLevel(サブレベル)
- Persistent Levelの下に配置される補助的なレベル。
- オブジェクトの管理や最適化に利用される。
- 必要に応じてロード・アンロードが可能。
なぜレベルを分けるのか?(メリット・デメリット)
メリット
-
パフォーマンスの向上
- 必要なレベルだけをロード・アンロードすることで、メモリやCPUの負荷を軽減できる。
-
チーム開発の効率化
- 1つのレベルを複数人で同時に編集するのが難しいため、レベルを分割することで並行作業が可能。
-
ローディングの最適化
- 例えば、マップの一部を非同期ロードすることで、シームレスな移動が可能になる。
-
レベル全体の動的な切り替えがやりやすくなる
- レベル全体のライティングを動的に変えるなどが必要な場合に切り替えが容易。
デメリット
-
管理の手間が増える
- SubLevelのロード・アンロードを適切に管理しないと、特定の物が表示されないなどの不具合が発生する可能性がある。
-
レベルの統合が複雑になる
- 例えば、異なるSubLevel間のオブジェクト参照が難しくなる場合がある。
手順🪄
PersistantLevelを作成する
File
→ New Level
を選択。
①メニューバーからショートカットキーも用意されており、Ctrl + N
でもOK
②空のレベルまたはテンプレートを選択し、作成する。
ここではBasicを選択
Ctrl + S
を押して、適当な名前を付けて保存する(例:MainLevel
)。
③この時点でPersisitantLevelは完成です。
どのようなステージを作成するかにもよりますが、基本的にこのレベルには何も置かないことが多いらしいです。
オブジェクトやライト、BPなどは以降で作成するSubLevelで分けて管理していきます。
Basicを選択してレベルを作成するとライティングや床などがデフォルトで配置されていますが、これをSubLevelに移動させる方法も解説します。
サブレベルを作成する
Levelsウィンドウ
のLevels
ボタンをクリックし、Create New
を選択。
①②サブレベルのテンプレートを選んで追加する
ここではEmptyを選択します。
保存場所の指定を求められるので、任意の場所に任意の名前で保存してください。
僕はだいたい以下のような構造にしています。
PersistantLevel: Content > {ProjectName} > Maps
配下
SubLevel: Content > {ProjectName} > Maps > {PersistantLevelName} > SubLevels
配下
また、要素ごとにSubLevelを分けていきたいので、ライティング関連を司るLighting
とオブジェクトなどの環境を司るEnvironment
、ゲームプレイ関連を司るGameplay
の3つを作成しました。
レベルを分割する
ここまでを行って、実際にプレイを開始してみると、当然何も変わりません。
今回のPersistantLevelはBasicというテンプレートを使って作成しました。
そのため、現状はPersistantLevel上にFloor
やLighting
などが直接配置されています。
前述のとおり、基本的にPersistantLevelには何も置きたくないので、まずはこれらの要素を適したSubLevelに分けていきます。
今回はBasicテンプレートを例にしますが、どのような場合でも基本的な動作は一緒です。
要素を移動させる
以降の作業はどの要素に対しても共通するため、ここではLightingを例に説明します。
この状態で、Levelsウィンドウ
に移動し、選択したオブジェクトを移動させたいSubLevel上で、右クリックします。
すると、Move Selected Actor to Level
という選択肢が表示されるので、これをクリックしましょう
これでLightingの移動は完了です。
残りのFloor
やPlayerStart
なども適切なSubLevelに移動させましょう。
プレイしてみる
この状態でプレイを開始してみると、画面が真っ暗になります。
これはレベルを分けたことによるもので、何のレベルを表示(Streaming)するかを設定しないとレベルが読み込まれません。
今回の例ではSubLevelのすべてを表示させたいので、すべてのSubLevelを選択して右クリック → Change Streaming Method
→ Always Loaded
を選択します。
これで再びプレイを開始してみると、以下のようにすべての要素が読み込まれ、PersistantLevelに全てを配置していた状態と同じになります。
Lightingを2パターン用意してみる
ここまでやってこう思った人も多いのではないでしょうか?
- 👤「いや、最終的に表示が同じならそのままでええやん?わざわざ分ける必要ないや~ん?」
もちろんそれで問題ないのであればわざわざこの手順を行う必要はありません。
ですが、例えばライティングの設定を切り替えるというような場面が必要な場合に結構便利だったりするので、その方法をご紹介します。
例えば、以下のように昼間の環境を用意したとします。
ただ、僕なんかは優柔不断なわけです。
なので、ある程度ライティングした後に、「これ、周りが暗かったらもっと良いかな」とか思い始めます。
これを愚直に実行すると、すでにあったライティングの設定値を変えたり、削除したり、追加したり、、ごにょごにょする必要があって、それらが終わった後、「うわ、さっきの方がよかったかも」と思い始めるのです。
そんな時に、現状のライティングをSubLevel上で組み立てておき、もう一つのパターンのライティングを別のSubLevelで組み立てます。
するとこのように、優柔不断な僕でもライティングを簡単に切り替えながら、見た目を決めることができます。
この用途はあくまで一例ですが、他にもさまざまなメリットがあります。
そんなに面倒な作業でもないので、ぶっちゃけやっておくに越したことはないと思っています。
まとめ📝
今回の記事では、UE5でのレベル分割について解説しました。
レベルを分割することで、開発の効率化やパフォーマンスの向上が期待できるだけでなく、作業ミスのリスクを減らし、柔軟なシーン管理が可能になります。
特にホラーゲームのように、ライティングや雰囲気の調整が重要なジャンルでは、この手法が大きな武器になるはずです。
僕自身も開発を進めながら、「これやっといてよかった」と実感しているので、ぜひ皆さんも試してみてください~
Discussion