UE4 レベル・ステージ・画面の切り替え制御についての呟きまとめ 2016/09/22

2016/09/22 第6回UE4ぷちコンの提出が終わったということもあり、個人的に気になったことを呟いたら、思いの外ご意見をいただけたので、まとめさせていただきました。 追記・編集 誰でも可能となっております。
1
Usui @Usui_KKYL

今回UE4ぷちコンでは、サブレベルの切り替えによってタイトル→ゲーム→結果みたいな画面制御を行ったので、その処理をGameState内に書いてたんですけど、(しかもサブレベルごとにbool値用意して必要なときはフラグを立てるゴリ押し感)そういう切り替えってどう書いたもんなのかな。

2016-09-22 17:10:15
Usui @Usui_KKYL

enumで画面を表す数用意して、現在の画面と一つ前の画面を管理する構造体でも用意して、実際のレベル読み込み・破棄は・・・サブレベルしか無いのであれば、GameStateとかGameModeで行う感じかなー。レベルを複数挟むようであれば、GameInstanceになるのかな。

2016-09-22 17:12:42
Usui @Usui_KKYL

画面って言っても、レベル単位でやるものでもない場合があったりするから、一概にはこのへんなんとも言えないんですけども。…サブレベル切り替え制御については、UMGのフェードも含めて、他のプロジェクトでも使用できるように作ろうかな。

2016-09-22 17:14:19
Minami⚡ @fuminyami

@Usui_KKYL 画面=レベルではなくてステージ=レベルって感じですかね。レベルの管理者の上にさらに画面制御を行う管理者がいるようなイメージで私は設計してます(ちょっと図を作ったほうがいいかもしれませんね、わかりにくくてすみません)

2016-09-22 17:21:51
Usui @Usui_KKYL

@fuminyami レベルの管理者の上に、さらに画面制御を行う管理者を置く・・・出来れば、で良いんですがもう少し詳しく伺ってもよろしいでしょうか? なんとなくイメージはできるんですけど、いざそれをUE4上でやるにはどうすればいいのかって、今回悩んでいたもので・・・(苦笑)

2016-09-22 17:28:19
ふぉるあ @forua477

@Usui_KKYL 僕の場合は小さいゲームを作る場合はタイトル→ゲームとかはサブレベルじゃなくてパーシステントごと切り替えるんですが(レベル読み直したほうが初期化が楽なので)サブレベルでやるのはOpenLevel時にカクつかないようにとかそういった理由ですかね?

2016-09-22 17:31:22
Usui @Usui_KKYL

@forua477 そうです。今回のぷちコンに関しては、フェードイン・アウトの処理を入れたり、背景として共通のマップを利用したかったっていうところがあったので。そのあたりを気にしないのであれば、パーシスタントレベルでバスっと切り替えたほうが確かに楽ですね・・・(苦笑)

2016-09-22 17:36:03
ふぉるあ @forua477

ぷちコンで出したゲームは時間があればサブレベル使ってタイトルのLevelからボタンを押すとシームレスにカメラが動いてゲーム画面へ遷移するって処理にしたかったけどタイトル→ゲーム→ゲームオーバーorリザルトの初期化処理を書くのが面倒だったから全部Persistent毎切り替えてる。

2016-09-22 17:37:52
alwei@C99 2日目金曜日 東“チ”37b @aizen76

@Usui_KKYL うちのゲームの実装は何も置いていないパーシスタントレベルから全てのサブレベルの制御を行ってます。画面やBGMのフェードもパーシスタントですね。

2016-09-22 17:44:01
Usui @Usui_KKYL

@aizen76 なるほど。パーシスタントレベルのBP内で、各サブレベルを読み込む何かしらのトリガーが発行されたら、サブレベルのロード・現在のサブレベルのアンロードを行い、必要であれば画面やBGMのフェードを行うといった形でしょうか?

2016-09-22 17:54:27
Minami⚡ @fuminyami

@Usui_KKYL コードレベルやBPのお話しは省略してますが、こんな感じのイメージです。パーシスタントは常駐なのでここにステージの読み替え管理者クラスを自作して置いたりなんかしてます。答えになってますでしょうか。 pic.twitter.com/LjjkDKe9o0

2016-09-22 17:55:43
拡大
alwei@C99 2日目金曜日 東“チ”37b @aizen76

@Usui_KKYL はい。そのような感じです。GamaInstanceに状態をもたせて、初回であればタイトル表示、ステージクリア後はRestartLevelで最初に戻りながら、次にどのサブレベルを読み込むか事前に保存して、タイトル表示を飛ばしてサブレベルに移行します。

2016-09-22 17:58:32
Usui @Usui_KKYL

@fuminyami 丁寧に図まで作ってくださってありがとうございます!すごくしっくり来ました! 今考えてみると、私の場合、レベルの切り替え管理をGameState,画面制御をUMGで作成してパーシスタントレベルのBPで適宜呼び出すという形を取っていました。(笑)

2016-09-22 18:03:04
alwei@C99 2日目金曜日 東“チ”37b @aizen76

@Usui_KKYL RestartLevelではなくRestartGameでした。docs.unrealengine.com/latest/INT/Blu… ちなみにBGMや画面のフェードだけでなく、プレイヤーキャラクター以外の入力もパーシスタントレベルでとってます。

2016-09-22 18:05:41
ふぉるあ @forua477

今後自作ゲームを作るならタイトル、ゲームオーバー、ステージ毎でPersistent毎に分けるかな。サブレベル膨大になるのも嫌だし。

2016-09-22 18:06:56
Usui @Usui_KKYL

@aizen76 訂正ありがとうございます(笑) あ、プレイヤーキャラクター以外の入力もですか!所謂メニューとか、タイトル画面での決定とか、そのあたりでしょうか? …ちょっと、改めてalweiさんのゲーム開発ブログを熟読させていただきます…!

2016-09-22 18:08:37
ふぉるあ @forua477

レベルブループリントを使うことも想定して、サブレベル毎に置くクラスなんかを分けたいから、全てを一個のPersistentで管理することは考えてもいないかな。

2016-09-22 18:11:16
alwei@C99 2日目金曜日 東“チ”37b @aizen76

@Usui_KKYL その通りです。UMG内の入力は不都合が多いのと、微妙にとれない入力もあるからです。使用する際には必ず、Consume Inputフラグを切っておかないと、プレイヤー側で入力がとれなくなるのにも注意が必要です。

2016-09-22 18:12:33
てんちょー / 筑野(ちくの)えり💕🍱 @shop_0761

俺もきっとPersistentMapでSubLevelの切り替えするだろうけど、最近はSubLevelでVolumeやらSoundやらを分けるのが流行っている(個人的に

2016-09-22 18:15:59
Usui @Usui_KKYL

因みに今回のUE4ぷちコンでは、パーシスタントレベル1つ。内部にサブレベルとして、タイトル・ゲーム・ゲームオーバー・リザルトを作成。サブレベルの切り替え制御はGameStateを継承したBP、画面のフェードはUMGで作成したフェード用Widgetクラスを用いてやりくりしてました。

2016-09-22 18:16:37
Usui @Usui_KKYL

@aizen76 なるほど…プレイヤー側で入力が取れなくなるのはまずいですね。細々としたことまでありがとうございます!

2016-09-22 18:18:47
てんちょー / 筑野(ちくの)えり💕🍱 @shop_0761

あとですね、なんかのSampleを見たときにLevel遷移でマップ切り替えじゃなくて、同じレベル内(床の下に部屋を作って瞬間移動する)で済ませるなんて技もありますね

2016-09-22 18:19:05
Usui @Usui_KKYL

そっか、冷静に考えたら、あれだけ広い作業空間がある中で、作ったエリア一つだけにする必要はないんだもんなー。カメラとかロードに気を使う必要はあるんだろうけど。・・・すごいなぁ。 twitter.com/shop_0761/stat…

2016-09-22 18:22:02