気づけばツール漬け

3D,2Dのツールを色々使ってみた記録を書いていきたいです。

「怪盗Qとアンサー警部」制作メモ レベルとその他編

f:id:mi-zmix:20220409175027p:plain

前回からの続きになります。

前回の記事はこちら。パッケージ化したゲームのリンクもあるので、よかったら遊んでみてください。

mi-zmix.hatenablog.com

 

 

レベル上のコリジョンの設定

ページのトップにある図は、ステージ1の全体像です。2Dですがブロッキングボリュームを並べて壁のコリジョンを設定しました。

ブロッキングボリュームを並べた

UE4はタイルマップでコリジョンを設定できますが、今回のゲームでは使いませんでした。タイルマップのコリジョンは多角形にもできますし、ピクセル単位で細かくエディットできるのですが、タイル単位での配置になるので使用を避けました。タイルマップエディタ全体も使い勝手が良いとは残念ながら言えないので(まだBETA扱いですし……)、設定していく段階で挫折しそうだなと思いました。

ブロッキングボリュームの配置は、Topビューにすると下図の感じになります。タイルマップも含めて全体が横倒しで表示されます。これはこういうものです。最初は戸惑いましたが慣れました。

f:id:mi-zmix:20220409180057p:plain

通路以外の壁になるところにブロッキングボリュームをおいていくのですが、床に近い部分と天井の部分をぴったりあわせていません。

f:id:mi-zmix:20220409180415p:plain

これはなぜかというと、天井の側は天井の絵の裏に隠れることができるようにするためです。ブロッキングボリュームよりはみ出た部分にプレイヤーキャラを隠すため少しずらしたところに設定しました。床に近い側は、ぴったりにしてしまうと壁のギリギリまでプレイヤーキャラが寄れないため、図のようにずらして設定しました。ぴったりの位置に設定して実際プレイしてみると、もっと壁に寄れそうなのに謎の見えない引っかかりがある感覚になりました。角ギリギリを曲がって進もうとするとかなりのストレスになりました。もはや不具合と言えたので対応しました。擬似的に立体的に見せてる平面絵なので、実際の3Dヒットと感覚のズレが出た感じです。

タイルマップの設定

ステージ1のタイルマップの全体像は下図のとおりです。タイル1マスのサイズは16*16で、幅と高さは80*80にしました。他のステージはもうちょっと広がっています。Pixel Per Unreal Unit は1にしました。これでブロッキングボリュームのサイズ調整を1cm単位で設定できるようになります。

f:id:mi-zmix:20220409181152p:plain

地面と天井でタイルマップのレイヤーは2枚です。天井の裏側はプレイヤーを隠す必要があるので、レイヤー同士の間隔である Separation Par Layer の値は128と、かなり大きめにしました。ここまで大きくする必要も無いのかもしれないですが、時々プレイヤーの動きによって、天井側のレイヤーが全部非表示になるという謎の現象があったので、念のため間隔を広めにしました(コリジョンの重なり具合によるものか? と推測しましたが、原因は不明です)

f:id:mi-zmix:20220409181921p:plain

ナビメッシュが動かなかった

プロトタイプを動かしていた段階では、敵キャラはナビメッシュ上で動いてました。しかし、タイルマップを配置してブロッキングボリュームも並べたあとでAIを動かしてみると、全く動いてくれなくなりました。

デフォルトの設定では、ナビメッシュの緑色の部分がほとんど床に出てこなかったので、これは通路が狭すぎか? と思い、ナビメッシュの半径や解像度を細かくする設定をして試しましたがやっぱり動いてくれませんでした。なにかやり方がだめだったのかもしれません。ぷちスタの期間が短いこともあり、検証はあきらめてナビメッシュを使わずに単純にターゲットポイントに向かうだけの動きにしました。MoveToLocationノードを使いました。
ターゲットポイントは敵アクターで個別に設定してAIコントローラーがそれらの座標を取ってくる流れにしました。ターゲットポイントBP型の変数を外から見えるようにして、ターゲットポイントをドラッグ&ドロップで設定しました。

f:id:mi-zmix:20220409185530p:plain

AIの動きは下図のような流れにしました。ターゲットポイントにたどり着いたら、Delayの時間だけ待機して、次のターゲットポイントへ向かう流れです。プレイヤーを見つけたあとで再スタートするとき、ターゲットポイントのリセットや位置のリセットをしてないので、敵の動きやタイミングがずれることになってます。

f:id:mi-zmix:20220409184901p:plain

ゲーム全体の進行管理

GameStateを使ってゲーム全体の進行管理をしました。GameStateはそういう意味じゃないって怒られそうですが、そんな使い方をしました。GamePlayStateというEnumを作って、インターフェイスを通して切り替える形にしました。巨大なスイッチノードになりました。全体像は下図の感じです。

f:id:mi-zmix:20220409191554p:plain

タイトルとかゲームスタートとかリザルトとかで分けてスイッチさせて、その流れでプレイヤーや敵にインターフェイスで通知して処理を切り替えていくようにしました。こんな感じで一箇所にあつめたのでゲームの進行が管理しやすくなりました。

f:id:mi-zmix:20220409191904p:plain

途中で演出を挟むことを思いついたので、あとから追加した形になってるのですが、わりと混乱もなくゲーム全体の流れの中に処理を挟むことができました。
問題は、GameStateの切り替えイベントを誰が発行しているのかってのが途中でわからなくなったことです。ぷちスタ後、3日ほど作業とめて時間をあけてしまったのですが、見事に忘れてました。発行元は宝物だったりウィジェットのボタンだったりゴールアクターだったりと、わりと多かったのでコメント多めで対応しました。あと、プレイヤーと敵からは絶対にステートを切り替えないというのは決めてました。プレイヤーと敵への通知は、必ずGameStateのステートが切り替わってからという流れにしました。

今までのぷちコンの制作では、こんなやり方をしてなかったのですが、やってみたら全体がわかりやすくなるかもって思ったので、今後もこんなやり方でやってみようかと思いました。

レベルの構成

パーシスタントレベルに、ステージのサブレベルをロードする形で構成しました。

f:id:mi-zmix:20220409193303p:plain

BGMはパーシスタントレベルで鳴らしっぱなしなので途切れずループできています。最終リザルトからタイトルに戻ったときもパーシスタントレベルをロードし直しせず、そのまま続けるようにしました。なので、長時間プレイしていると不具合とかあるかもしれません……。エイジングなんてしてません。なにかあったらごめんなさい。

タイトル時とゲーム時の音の切り替え

BGMの話をしたのでついでに、タイトル中の音とゲーム中の音の切り替えについて書きます。タイトルとゲーム中で、Attenuationの設定を切り替えるようにしました。タイトルとリザルト表示中はLowとHighのカットオフを変えてちょっとこもったような音になるように設定しました。デフォルトは20000と0.0くらいになってると思います。

f:id:mi-zmix:20220409193923p:plain

切り替えは、AdjustAttenuationノードを使いました。

f:id:mi-zmix:20220409194731p:plain

おわりに

久々に2Dがやれて楽しかったです。
次のぷちコンに参加するなら、たぶんUE5を使うと思います。UE5でも2Dはやってみたいのですが、せっかくのUE5なので学習かねて3D素材でなにかやりたいと思いつつ、UE5が生かせるスペックのPCが無いので迷っています。