【UE】3Dアクションゲーム開発スタート!動く床や敵などのギミックを作成【100日チャレンジ】

初学者がUnreal Engineによるゲーム制作に100日取り組んで、どこまでプロの開発者に近づけるのかを検証します。
今回からアウトプットの作成を開始。3Dアクションを作ることを目標に、動く床や追いかけてくる敵などのギミックをプログラムしました。
アウトプットの作成を開始!
Unreal Engine100日チャレンジに挑戦している、Neruです。
この企画は、Unreal Engineの初学者である筆者が、100日間の学習でどれだけのものを作れるようになるのかを検証するチャレンジ企画です。
前回、フリーズなどの問題に直面しつつも、「Unreal Engine5で極めるゲーム開発」などの学習ソースから、インプットを完了させました。
今回からはアウトプットの完成を目指し、オリジナルゲームの作成に着手します。
アウトプットとして作るゲームは、3人称視点の3Dアクションゲームです。アクションゲームであれば、学んできたプログラミングの知識を活かせますし、3人称であればアクションの動作も取り入れやすいため、この形式にしました。
また、Unreal Engineは3D表現が得意であることから、せっかくなら2Dではなく、3Dのゲームを作ろうと考えたのも理由の一つです。
プログラミングの学習成果を活かし、ゲームとして遊びごたえがあるものを作るために、まずはギミック制作を始めました。
今回作ったのは、以下のようなギミックです。
今回製作したギミック
- 動く床:指定した範囲を往復する床。
- 落ちる床:キャラクターが乗ると一定時間後に落下。
- 追尾する敵:プレイヤーを検知して追尾。
- 特殊アイテム:取得すると攻撃ができるようになる。
各ギミックについて、設計意図と実装手順を詳しく解説します。
動く床、落ちる床などを作成
まず、往復する床や落ちる床など、基本的なギミックを制作することにしました。床のギミックはプログラムを使って作りやすいですし、3Dアクションゲームを作るうえで欠かせない動きのある要素を追加できます。
往復する床を作成!
往復する床を作成します。以下のような動きを想定します。
往復する床の仕様
- 一定方向に、一定距離移動
- 一定の時間、その場で静止
- 元の位置に戻る
- 最初から動きを繰り返す
このように往復する動きを実現すれば、タイミングを見計らったアクションが行えるようになります。また一回失敗しても往復が続くので、再チャレンジが可能になります。
今回は、往復する床のブループリントを作成したうえで、①移動距離と②静止時間を変数にして往復運動を実装することにしました。また、これらの変数をエディタ上で操作可能にすることで、設置した床ごとに、簡単に動きを設定できるようにしようと考えました。
ブループリント内の変数を「インスタンス編集可能」にすることで、それぞれのインスタンスごとの設定が簡単にできるようになります。インスタンスとは、ブループリントという設計図から作られた実体で、ブループリントさえ作れば複製でき、個別にパラメータを変えることができるものです。
往復運動を実現するために、タイムラインを使いました。タイムラインとは、時間の流れに沿ってイベントや変化を制御する仕組みです。タイムラインは再生と逆再生ができるので、これを使えば時間軸に沿った往復運動が再現できるはずです。
ただ、タイムラインの使い方で少し苦戦。最初に組んだブループリントは以下のようなものだったのですが、一往復だけして、動きが止まってしまいました。処理が終わった後の実行ピンが、「reverse」にのみつながっているので、一往復しかしないのではないかと考えます。
そこで今回は、Flip Flopノードを使って、処理が実行されるたびに「play from start」と「reverse from end」を切り替えるよう設定しなおしました。Flip Flopノードは、一度呼び出されるごとに「A」と「B」を交互に切り替える制御ノード。これを加えることで、意図通り往復運動が実行されるようになりました。
往復する床はこれで完成です。
落ちる床を作成!
今度は、落ちる床を作成します。落ちる床の仕組みは、以下のようなものを想定します。
落ちる床の仕様
- キャラクターが上に乗ると、色が変わる
- 3秒後、床が下に落下する
- 数秒後、もともとあった場所に床が戻る
床が反応を示していることをわかりやすくするために、色が変わるような設定にします。また、リスポーンした後も、変わらない動きを再現するようにしなければなりません。リスポーン後の動きが変化してしまうと、再挑戦した際のプレイ感覚が変わってしまうからです。
以上の仕様を実現させるために、以下のようにコンポーネント(構成)を組みました。
キャラクターが床を踏んだら何らかのリアクションを返すために、透明の「Box Collision」を設置します。「Box Collision」は左上の「+追加」というタブから追加可能です。デフォルトで「OverlapAllDynamic」のコリジョンを持っているため、キャラクターや物体が重なったとき(オーバーラップ時)にイベントを起こすことができます。追加した「Box Collision」を右クリックすることで、オーバーラップ時のイベントを追加できます。
今度は、落下する仕組みを作っていきます。一定時間経過後に落ちるようにするために、物理シミュレーションを有効にしようと考えました。物理シミュレーションを有効にすることで、物体に重力がかかるようになり、自然な落下運動を再現できます。以下のようなブループリントを組みました。
ただ、ここで不具合に直面。物理シミュレーションを有効にすると、運動自体はするのですが、一瞬で地面についてしまう、キャラクターが吹き飛ばされてしまうなどの、意図しない挙動が発生してしまいました。
この不具合は、床の質量を軽くしすぎていたことが原因でした。物理シミュレーションを有効にした際、質量が軽すぎると、重力の影響を受けすぎて、極端な挙動を示してしまいます。この問題を解決するため、質量をある程度確保しておくことで、自然な動きが再現できます。
これで、往復する床や、落ちる床といった、基本的な動く床のギミックを作ることができました。
敵を作る
次は、キャラクターを追いかけてくる敵を作ることにしました。こちらを追尾するシンプルな動きで、接触したら、プレイヤーキャラクターがロストする仕様にします。能動的に動く敵は、動く床のようなギミックとはまた違うスリルを与えてくれるはずです。
ブループリントから変数を選択して、赤枠の部分の「インスタンス編集可能」にチェックを入れれば……。