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

初学者がUnreal Engineによるゲーム制作に100日取り組んで、どこまでプロの開発者に近づけるのかを検証します。
今回からアウトプットの作成を開始。3Dアクションを作ることを目標に、動く床や追いかけてくる敵などのギミックをプログラムしました。
まず、簡単な図形を組み合わせて、敵の見た目を用意します。胴体を模した円すい体と、頭部を模した球体のスタティックメッシュ(形状データ)を用意して、人型に見えるように配置します。二つの形状を選択して、モデリングモードから、「Merge」を選ぶことで、二つの形状を組み合わせたスタティックメッシュを作ることができます。
次に、モデリングモードの「Edit Pivot」を選択して、中心点を編集します。「Bottom」に合わせて、配置した際にキャラクターの底部が地面と接するようにします。
見た目が作れたところで、「Character」クラスのブループリントを作成。コンポーネントに「Static Mesh」を追加して、さきほど作成したものを割り当てれば、敵キャラクターの見た目は完成です。
敵に追尾をさせるために、「AI Move To」ノードを使うことにしました。「AI Move To」ノードの「Pawn」に自分自身(Self)を、「Target Actor」にプレイヤーキャラクターを指定することで、追尾する動きを再現できます。
ただ、この方法を使う場合、マップ上に「Nav Mesh Bounds Volume」を追加して、ナビゲーション範囲を指定する必要があります。配置しないと「AI Move To」で敵を動かすことはできません。
筆者は、「Nav Mesh Bounds Volume」と間違えて、「Nav Modifier Volume」を配置したせいで、敵が思うように動かずに頭を抱えました。「Nav Modifier Volume」は特定のエリアでAIの移動経路を制御したり、移動コストを変更するもので、「Nav Mesh Bounds Volume」とは別物であることに注意が必要です。
「AI Move to」ノードの使い方
- 「Pawn」ピンに動かすアクタを接続
- 「Traget Actor」に追尾させるアクタを接続
- マップに「Nav Mesh Bounds Volume」を配置し、追尾範囲を覆うようにセッティング
「AI Move To」を使用したことで、追尾が可能なようにプログラムを組みましたが、ここで問題が発生。敵が一切動かなくなってしまいました。
原因を探ったところ、スタティックメッシュのコリジョン設定が問題でした。
ブループリントのコンポーネントにスタティックメッシュを追加した際に、デフォルトの設定が「Block All Dynamic」になっていたため、他の物体と干渉を起こしていたものと思われます。コリジョン設定を「Character Mesh」にして不必要な物理干渉をなくすことで、敵が思い通りの動きをするようになりました。
動く物体を用意する場合、コリジョン設定を間違えると、思うように動かない場合があります。コリジョン設定はゲーム中の接触に関するさまざまな問題を引き起こすことがあり、どのアクタもコリジョンを持つため、設定の管理には注意が必要だと改めて思わされました。
あとは、敵が特定の範囲内に入ったときに追尾を開始し、範囲から外れた場合に元の場所に戻るようにすれば、完成です。また、検知されたことがわかるように、検知したときに敵の色が変わるようにします。ブループリントに「Sphere Collision」を追加して、以下のようにブループリントを組みました。
「Sphere Collision」は透明な球形の当たり判定です。その当たり判定にアクタがオーバーラップした際に、それがプレイヤーキャラならば、色が変わって追尾を開始するというプログラムになります。オーバーラップが終わった時には、色が元に戻り、最初の位置に戻るような仕組みです。
これで、敵の設定は完了です。
攻撃手段を作る
次に、プレイヤーに敵への攻撃手段を用意しようと思います。アイテムを取得すると攻撃ができるような設定にすれば、追いかけられるばかりだった敵を倒せたという達成感を届けられます。
攻撃手段は、矢を飛ばして攻撃するようなイメージで、アイテムを取った状態で左クリックをすると攻撃できるようにします。
まず、矢を作成します。弾に必要な機能は、以下の通りです。
矢に必要な機能
- まっすぐ前に飛翔する
- 敵に当たったら敵を消滅させる
- しばらく飛ぶか、敵に当たったら消滅する
飛翔する動きは、ブループリントのコンポーネントに「Projectile Movement」を追加すれば、簡単に実現できます。「プロジェクタイル」のタブから「Initial Speed」と「Max Speed」を設定して、速度を設定。「ベロシティ」タブからX方向の動きを設定することで、矢がまっすぐ飛ぶようになります。
そのうえで、以下のポストのようにブループリントを組めば、矢は完成です。おまけで、敵に当たった場合は、その位置で爆発エフェクトが発生するようにしました。
ちなみに、中はこんな感じです…! pic.twitter.com/qgLRMg7WdT
— GAMEMO|Web3とメタバースのインタビューメディア (@Gamemo2con) December 12, 2024
新たにアクションを追加するためには、①「入力アクション」の追加、②「入力マッピングコンテキスト」の設定、③プレイヤーキャラのブループリントを設定、という3ステップを踏む必要があります。
まずは、新しい「入力アクション」を追加。入力アクションでは、ボタンを使うのか、それともマウスを使うのかといったデバイスの設定や、どんな操作に応じてイベントを発生させるのかといった要素の設定ができます。今回はクリックした際に矢が飛べばいいので、「Value Type」には「Digital」(ONかOFFかの二択)、「Trigger」には「Pressed」(ボタンが押されたとき)を指定します。
続いて、入力マッピングコンテキストを設定します。マッピングコンテキストは、入力アクションを束にしたようなもので、普通はすでにキャラクターに紐づいている既存のマッピングコンテキストがあるはずです。その場合、新たにマッピングコンテキストを作る必要はありません。
入力マッピングコンテキストでは、キーを指定します。今回は、左クリックを指定しました。
以下、入力アクションと入力マッピングコンテキストの比較表です。この二つは似て非なるものなので、注意が必要です。
ここまできたら、ようやくキャラクターのブループリントを組めます。以下のようなブループリントを組みました。
アイテム取得時に攻撃ができるようにするために、「Branch」ノードを使いました。「Branch」は、特定の条件がTrueのときとFalseの時で処理を変えられるノード。
今回はアイテムを取得したときに、「Can Attack」という変数がTrueになるようにしました。これで、アイテム取得時のみ攻撃ができるようになります。
特定の条件下である操作が可能になるようにするには、プレイヤーキャラのInputActionにブランチノードをつなぐとよいです。
— GAMEMO|Web3とメタバースのインタビューメディア (@Gamemo2con) December 18, 2024
プレイヤーキャラクター側に「攻撃可能かどうか」を判定するBoolean変数を用意して、アイテムを取得した際にtrueにセットすることで、狙った仕組みが作れました。 pic.twitter.com/M8otL1Uo64
最後に、攻撃可能かどうかをわかりやすくするために、アイテム取得時に、プレイヤーキャラクターの色が変わるように設定しました。これで、「アイテムを取ったら攻撃可能になる」という一連のギミックが完成しました。
次回の目標 : ステージを完成させる
ステージを構成する基本的なギミックを作成できました。
今回感じたのは、何かの目的を持って仕組みづくりをするのは、本当に勉強になるということでした。自力で一から仕組みを作ろうとする時には、テキストから受動的に学ぶ時とはまた違った学びが生まれます。テキストから学ぶことも重要ですが、自分で何かを作ることの大切さに気が付かされました。
次回は、今回作ったギミックを活かして、ゲームとして遊べるステージを構築していきます。ブロックやゴール地点を配置したり、UIを作ったりして、ゲームとして遊びがいのあるものを作ります。
いよいよこのチャレンジも大詰めです。ステージ完成に向けて、頑張ります。
- 1
- 2
簡易的な敵ユニットの見た目。