第18回UE5ぷちコン参加しての感想・技術的な振り返り

第18回UE5ぷちコンに作品を無事投稿できましたので感想や技術的な振り返りをまとめました。 制作時のUEバージョンは5.0.3でした。公開にあたり投稿当時からBPなど修正・整理していますがご了承下さい。

参加しての感想とか

お題「かける」発表直後のメモを見返すと、

奇をてらわずつくってみる

毎度既存のゲーム性から逸脱することになるが、労力の割に完成度や面白さが上がらず毎度泣きを見る、先人が積み上げたジャンルというものは偉大。

不便さを解消していく、または不便なゲーム性禁止

主人公が時間経過とともに小さくなり(不便になり)、ゲーム内アイテムを集めて大きくなる(不便を解消していく)というゲームをつくったり、プレイヤーをキーボードで操作して、同時にマウスで選択した床をスライドさせ揃えて呪文を完成させ侵入者を呪文でやっつける、というゲームを作ったがスリルとか達成感より不便さが大きくゲームを十分楽しめなかったと結論づけたため

という過去の反省ふまえつつテーマの「かける」に沿ってどうつくるか思案しているうち、ぷちスタ☆開催でタスクリストが発表され、カウントダウンがタスクにあったのでベルトスクロール(当初のイメージとしてはダブルドラゴンシリーズやくにおくんシリーズ)的なゲームで行こう、となりました。

ぷちスタ開催中は本業が多忙だったのと、Boothで出会った素敵な「太った猫」モデルをどうしても使ってみたく、ひたすらIKリターゲッタの感触を確認していて企画へ参加できる要素がひとつも完成しておりませんでした…(8月中旬くらいまではうだうだIKリターゲッタの検証していて「あ、今回終わんねぇな」と思っていました)

太った猫のストアページ

ぷちスタ☆を開催していた第18回ぷちコンサーバー(Discord)に参加し、お祭りの雰囲気だけは感じ取らせてもらっていました。

ぷちコンやぷちスタ☆、アンリアルクエストの作品完成という目標に向かって他の人も動いているのが見える場というのはDiscordでもTwitterでもとても良いことだと、参加させてもらう度感じます (今回途中経過をどこにも出せなかった自分が書くのもなんですが…)

8月末から追い込んでいたものの提出期限日の9/5(月)深夜になっても提出できる体裁に到達できるかどうか分からなかったのですが、なんとか提出できたので良かったです。(夏休みの宿題を溜め込む小学生並の感想)

無理はしましたが、期間中仕事やら急に1週間甥っ子らを預かって面倒見たり忙しい時期ながらもちゃんとぷちコン提出できたのでえらい!ということで今回も自信に繋がりました。

逆に、レベルデザイン的な部分が弱かったり攻撃時のコリジョンが大きめで調整甘めだったりエフェクトが一切つけられていなかったり敵も自機と同じ攻撃モーションだったり、動画ではちゃんとLumenが反映されていなかったり、タイトルやUIまで手が回らず、タイトルにいたっては話題のStable Diffusionで以前作成していた、イマイチな画像を貼っつけただけだったのはつらいものがあります・・・・・(AI使うにしても、もっとマシなものが生成できる筈…Stable Diffusion界の面汚しよ…)

やっつけが過ぎる…!

技術的な振り返り

今回からUE5に移行して初めてのゲーム制作だったので、良かった機能や戸惑った箇所、小技など紹介。

IKリターゲッタ

IKリターゲッタのプレビュー画面
UEマネキンと互換性の無い、インポートしたキャラクターへアニメーションを流用するにあたり、最強の機能でした。

これまでも別のスケルトンからアニメーションを流用するためにはリターゲット機能を利用すれば良かったのですが、それをやってもアニメーションの流用が必ずうまくいくとは限らないといった感じで、調整に延々と時間を取られるものでした。

このIKリターゲッタを利用することで、一度設定さえしてしまえばUEマケプレのマネキン対応のアニメーションを好きなだけ・ほぼ破綻なく流用できるのでとてつもなく心強い機能でした。特に攻撃技のバリエーションが手持ちのアニメーションアセット分だけ追加調整無しに増やしていけるのが良かったです。

リターゲット機能同様にお互いのどの骨が共通なのか関連付け、さらにこちらは手足用やフルボディのIKソルバを指定できるため、このおかげでほとんどのアニメーションで破綻が見られませんでした。

太った猫のスケルトン側のIKリグ設定

IKリターゲッタは以下のリンクがとても参考になります。 www.docswell.com youtu.be

また今回利用させていただいたキャラモデル達は主にVRChat、Unity用にセットアップされており、リターゲットしたアニメーションを利用したい場合ルートボーンの基点が腰にあるためUE標準マネキンに合わせて足元の基点にルートボーンを追加する必要がありました。

修正前のボーン構造

そのためBlenderでfbx形式ファイルを読み込んで、足元の基点にルートボーンを追加してそれを既存ボーンの親ボーンとしたのちメッシュとボーンを再度fbx形式に書き出して読み込むことでUE5側でアニメーションを流用できる状態に持っていく事ができました。

Blender側でルートボーンを仕込んでいるところ

また、それでもリターゲットルートモーションがうまく再生されない!ということがあったのですが、以下のリンクを参考にIKリターゲッタでルートの設定を修正すればしっかりリターゲットできました。 qiita.com

吹っ飛び処理のでっち上げ (アニメーション側でルートモーションに加算)

アニメーション側で加算したルートモーション吹っ飛び

ゲームの遊び的にも見栄え的にも強ダメージを食らった場合敵も自機も派手に吹っ飛んで更に敵や設置物を巻き込んで欲しかったので、本来は「Launch Character」ノードなど利用すればいいのでしょうが、想定通りに吹っ飛ぶよう数値を調整するのが手間に感じられたため、今回は時短的に強ダメ時の倒れアニメーション側のルートボーンに飛ばしたいだけのトランスフォームを加算してふっ飛ばしました。

実はアニメーションアセットの各ボーンにキーを追加して編集することも可能で(割と前からある機能ですが私は最近知った)、ルートボーンに吹っ飛ぶ方向のトランスフォームを加算し、ルートモーションではアニメーションの高さ方向の動きは反映されないためルートボーンの一つ下のボーン(写真ではchestのボーン)に高さ方向の動きをつけました。

アニメーションアセット画面から編集する方法
カーブエディタで編集が可能

EnableRootMotionへチェックを忘れずに

WorldPartition

WorldPartition用に配置されたLevelInstance
UE5からレベルストリーミングは主にWorld Partitionで管理するように置き換わっています。(とはいえ従来のレベル機能も利用することも可能です)

使い方をよく理解していなかったため、右往左往しておりました。 こちらの記事がWorld Partitionについてわかりやすく解説してくださっています。

metatimecg.com

特に良かったのは配置されたアセットを選択して右クリック→レベル→「LevelInstanceを作成 」でコンテンツブラウザ上の保存場所を指定すれば、選択したアセット群をひと固まりとして移動や回転、スケーリングして扱え、そのコンテンツブラウザへ保存したLevelInstanceは従来のサブレベルのように別のレベルにも配置できるので扱いが楽でした。

今回時間がなくマケプレアセットのデモマップから一部を拝借したりしていたのですが、さすがデモだけあってアセットの密度が高いため、適切に「ワールドセッティング」からランタイム設定のGridsの数値を適切に設定していなかったのもあってパフォーマンスが低下していた場面も見られました。

ワールドセッティングにてGridsの数値を適切に設定する必要がある

現在は上記のworldpartitionの設定を適切に設定し、コンソール コマンド 「wp.Runtime.ToggleDrawRuntimeHash2D」 を実行して確認すると、ある程度上手くセルのロードアンロード切り替えてくれているかな、という感触です。

コンソール コマンド wp.Runtime.ToggleDrawRuntimeHash2D を実行してセル可視化

WorldPartitionだけでなく上記のコンソールコマンドの見方などこちらのバ美肉おじ…お姉さまがわかりやすく説明してくださっています。

youtu.be

GameplayAbility System

GameplayAbility Systemがどんなものか検証したく、今回初めて利用してコンボ攻撃や被ダメージモーションの再生と状態を切り替えたりしています。 以下の解説を参考に組み込ませてもらいました。

historia.co.jp

okawari-hakumai.hatenablog.com

lunanelis.hatenablog.com

UE5ではGASの一部ノード名が変わっていたりしているため、こちらの記事もとても参考になります。

lunanelis.hatenablog.com

ほぼ上記の解説参考に組み込まれているため特段紹介はしないです。 そもそもこれくらいの規模のゲームであればGameplayAbility Systemがオーバースペックなのは否めないですが、プレイヤー入力側のコンボBPがこれだけで済むのはすごい画期的ですね。

(その分分散していろいろコンボ用のGameplayAbilityのBP増えますが、それでもそれぞれのアビリティ同士でこれ実行中はこれ実行しない、みたいな相関をGameplayAbility側の「クラスのデフォルト」などで指定できる分ノードの総数は減ると思います)

コンボこれだけで良くなる
GASのコンボ用BPがいっぱいになる

敵ロジック

これは前回のゲーム「スライドトラップダンジョン」の自作ロジックをほぼ流用しています。

AIロジック
とてつもなくシンプルで、トリガー用BPにプレイヤーが触れたら行動開始、AIMovetoで移動、近寄ったらランダム(重み付き)で攻撃か周囲のランダム地点へ移動、攻撃後にランダムなインターバルで再度攻撃か、ランダム移動かといった分岐をするようになっています。

また、この攻撃後のインターバル秒やどれくらい近づいたら攻撃へ移行するかの半径といった各種変数はキャラごと変更できるようにして、ボスキャラは攻撃後のインターバルを少なくしてコンボを積極的に出すようなロジックにしています(期限的にそれが限界でした)。

その他

やられた時とリスポーン時の点滅
やられた時の消滅表現は単純だけど分かり易いですね。先人は偉大。

すごく簡易なやられ表現

タイムラインにイベントトラックを追加してイベントのキーを追加し、0.1秒おき「Set Actor Hidden In Game」で表示と非表示繰り返して、だんだん間隔を開けてそれっぽくしています。

くにおくんライク移動メソッド…
一般的なベルトスクロール的操作感に見えるよう、シンプルな処理ですが常に横向きで移動するように手を加えました。被ダメ処理時に敵を向くようにしていたためその後敵と逆方向に入力を入れても敵を向いたまま移動となるのは想定していなかったのですが、気に入ってそのままにしています。そのほうが操作感として良かったので。
敵向き移動

最後に

こちらの方のツイートに全面同意です!過去の作品から持ってきた敵ロジックなどに今回は大いに助けられました。

ぷちコンのレギュレーションには「過去の資産を使い回すことはOKです」とありますので…!

ぷちコンレギュレーション(第18回のものをキャプチャしたもの)

以上、第18回UE5ぷちコンについての振り返りでした。 ぷちコンはいいぞおじさん「ぷちコンはいいぞ」