はじめに
第18回UE5ぷちコン応募作「R.T.A.P.A.」の制作メモです。UEは、5.0.3を使いました。今回もぷちスタの企画に乗ったので、お題にあったタイムアタックゲームを作ることにしました。
アイテムを集めてゴールするタイムアタックってことで、どんなのにするか考えている最中に「ジャンピングフラッシュ」を思い出しました。当時、ジャンピングフラッシュの最初のステージでタイムアタックしてたのを思い出し、そんな感じにしたいと考えました。このゲームでは走るほうがメインですが、アイテムを集める順番というかルート選択が重要な感じにしようと思いました。
今回の制作では、いままでのぷちコンでやってきたことがかなり生きたので、悩むことは少なくスムーズに作ることができました。確実に経験値は積み重なっていると思いました。やっててよかったぷちコン。
応募した動画はこちらです。
アプリのパッケージをアップしました。Windows用です。
不明なアプリとして注意されると思いますが、「詳細」をクリックから「実行」で回避できると思います。
プロトタイプ作成
まずはプロトタイプを作って、走る速度の感覚とかジャンプの距離を測りました。1mのキューブを並べて、ジャンプの高さと距離を最初に決めました。それらの場所に届くようにキャラクタームーブメントの値を調整しました。スピーディーなジャンプにしたかったので、重力をデフォルトの3倍くらいにしました。
あとトリガーを見えるようにしたゴールアクターや、スピードアップ、スピードダウン用のアクターを作成して動作を試しました。
最初は、もうちょっとカメラを上からにして見下ろす感じでやっていたのですが、操作していてイマイチに感じたので、考え直してカメラを下に下ろす感じにしました。段差や穴が多いゲームなら、カメラを上げるほうが良いかもしれませんが、今回のゲームはそれほどギミックが多くなく、走り回るのがメインになったので先の方が見渡せる視点の方が合っていると思いました。
レベルデザイン
ゲームに必要な部分と流れの部分のBPを組んでいくのはわりとスムーズに終わったので、レベルデザインに時間をかけました。まずはぷちスタに応募するための物なので比較的狭くして、素早くまわれるステージにデザインしました。ステージAの全体は以下の感じです。アセットは、「Platformer Starter Pack」と、「Low Poly Style Deluxe 2: Tropical Environment」を使いました。どちらも、無料コンテンツになっていたことがあるやつです。
ぷちスタが終わってから追加したステージBの方は、ちょっと広くして飛び回れるようにジャンプ台を多く設置しました。そのうえで、水に落ちたら上がりにくくするために足場を減らしました。飛び過ぎたら下に落ちるのですが、落ちたらなかなか上がってこれないというわりとむかつくステージになっていると思います。ステージBの全体は以下のようになってます。動く床はにぎやかしで置いたようなもので、ほぼ無意味です。床を動かすのは、InterpToMovementを使いました。
連続ジャンプも仕込みました。連続ジャンプができるルートを探すのが重要という感じにしたかったので、いろいろ試行錯誤しました。ステージ全体を連続ジャンプでつなぐようにするのは可能でしたが、それは何も考えず飛んでいればなんとかなるマップになってしまうので避けました。それより、最短ルートを自分で探す方が楽しいかなと思いました。ステージBは自分でも最短ルートは見つけられていません。
全体のBPの構成
ゲームが終わるためのルールは、時間切れになるかゴールするかなので、GameModeで時間を管理することにしました。あと、キーとなるアイテムを必要な分だけ集めてからじゃないとゴールできないので、キーアイテムの数もゲームモードで管理しました。
カウントダウンタイマーでTickを使っているので、そのついでにゴールに必要なアイテム数が揃っているかの監視を常に行う流れにしました。
チェックしている関数の中はシンプルです。現在持ってる数とマップ内の数を比較してCanGoalを設定します。
プレイヤーキャラがゴールのコリジョンにオーバーラップした時、GameModeのインターフェイスを呼び出して、ゴール可能かどうか判断しました。ゴール可能ならゲームステートに通知して、ゴールから先の流れに移行させました。
今回も前回のようにGameStateの中で、ステートに分けて処理を流す方法を取りました。カスタムイベントで流れを整理したので、個人の感想ですがだいぶすっきりしてわかりやすくなったと思います。
スイッチで切り替えたあとで、関係各所(主にプレイヤーキャラと、プレイヤーコントローラー)に通知を送る流れにしました。
ゲームスタートからメインのゲーム開始までは、以下の感じです。
ゴールしてからリザルトへの流れは以下の感じです。
今回はプレイヤーキャラの中にもステートのスイッチノードを設定しました。GameStateからの通知によってその場面でプレイヤーキャラが取る行動を分けて整理した感じです。プレイヤーキャラの行動は主に動作(入力)の可否と速度の変化くらいですが、ステートにわけたことで管理しやすくなったと思います。
ギミックなど各要素
速度変化
プレイヤーキャラクターは、速度アップしたときにアニメーションの再生速度もアップさせるようにしました。少し強引に、アニメーションBPのステートマシンをいじって、Speedの値が600を超えたら、アニメーション再生レートを変えるという方法にしました。
Play Rate のピンは最初見えてないのですが、詳細の中にあるパラメータのBindをクリックすると、Expose As Pin というメニューがあるので選択するとノードに現れます。
ジャンプ台
ジャンプ台はローンチキャラクターノードを使いました。最初は上方向に大きく飛ばす感じで作っていましたが、高い段差に乗る操作がしにくいし、カメラも見づらくなったのでやめました。前方向に大きく飛ばすように調整しました。
猫かぶり
プレイヤーキャラはクインのままだとなんか寂しかったので、猫をかぶせるようにしました。何度か使いまわしてる猫のモデルです。質感はクインに合わせました。クインのテクスチャを開いてベースカラーとラフネスの色をとってきて、サブスタンスペインターで設定しました。が、微妙につるつるだった気がしたので、結局最後は見た目の感覚で数値を調整しました。
ミニマップ
ミニマップはSceneCaptureComponent2Dコンポーネントを使って簡単に実現しました。アクターの座標をとってきて、ウィジェットの座標に変換するとかしなくていいので楽です。難点があるとすれば、カメラが見たまんまを映し出すので情報量多くなりがちなところかもしれません。
キャプチャしただけだと、マップの広さのわりにプレイヤーキャラやアイテムが小さいので、大きなアイコンを表示するようにしました。アイコンを見えるようにした場合は、下の図の大きさのイメージです。
アイコンは、ペーパースプライトのコンポーネントをアクターに入れて、オーナーから見えないようにして、キャプチャーのカメラにだけ映るように設定しました。PaperSpriteの詳細の、Renderingの中のAdvancedの中にある設定です。
Owner No See で自分自身から見えなくなり、Visible in Scene Capture Only でキャプチャにしか映らなくなります。あと、これのコリジョンはナシにするのを忘れないようにしましょう。なぜかキャラが重なっていないのに、アイテムが取れちゃうことがあってしばらく謎でした……。カギの上に透明な床が発生していたことで、「アイコンのコリジョンだ!」と気づくことができました。
ミニマップの設定については、UE備忘録本舗さんの動画が参考になりました。ありがとうございます。
その他
ステージセレクトに動画を使ってみました。ファイルはmp4にしました。動画の入れ方は以下のサイトを参考にしました。ありがとうございます。
rwiiug.hatenablog.com動画をとってみて動かそうとおもったら、UE5.0.3だとDX3D12に対応していないというエラーが出てしまいました。エラーメッセージをまるごとコピペして、そのまま検索したらUEのフォーラムに対処法などがあったので対応しました。
DirectX12を使わないっていう選択肢がありましたが、自分の作業環境の場合、DX12にしないとエディタが不安定になるのでやめておきました。
Electraのプラグインをいれると再生できるとあったので、そのようにしてみました。
それでも、テクスチャーのプレビューがされなかったり、ウィジェットにもプレビューが映らなかったり、パッケージ化してみたら動画が再生されないことがあったりと、なかなか不安になる挙動をしていました。動かない時は真っ白になっていたので、念のため動画が再生されない場合は静止画を表示するという流れにしておきました。アップしてあるパッケージで動画が動いてなかったらすいません……。
MediaPlayerのPlayのリターンバリューは動画の再生中ならTrueがかえるので、そうじゃない場合にImageのBlushの中のTextureを表示する流れにしました。
おわりに
今回UE5を使いましたが、使っているうちにコンテンツドロワーは常に出しっぱなし、左側のツールは開きっぱなしで、結局UIのレイアウトはUE4のときと似たような並べ方になっちゃってました。慣れって恐ろしい。
次やるときは、UEのモデリング機能とか使ってみたいです。