Unreal Engineで初めてのゲーム作成

UE5 勉強メモチュートリアルやってみた

ゲーム開発なんて全くしたことがないけれど、Unreal Engineに興味をもって勉強を開始。
他にもいくつかやってみたけど、この動画が分かりやすくてよかった。
操作が速いからピンポイントで見直すのが大変だけど、見ればちゃんとわかるようになってる。
何から手を付けていいか分からなかったので助かった。

How to Make Your First Game in Unreal Engine 5 in 2024 – Full Course

エンジンのUIは日本語にすると微妙なので英語のままの方が使いやすそう。
ネット上の情報も英語の方が充実してる。
以下、覚え書き。

Game Mode と Character Blueprints

公式資料:ゲームモードをセットアップする

最初にGame ModeとCharacterのBlueprint Classを作成する。

Game Modeを設定する場所
・プロジェクトのDefault Game Mode
・ワールド設定のGameMode Override

Characterを設定する場所
・Game ModeのDefalut Pawn Class
・ワールド設定のDefault Pawn Class
・PlayerStartオブジェクトのDefalut Pawn Class

ここで作成してたCharacter Blueprintにプレイヤーの挙動を実装していく。

調査

公式資料:ブループリントの種類

Blueprintの種類説明
Level Blueprintレベル全体のグローバルなEvent Graph。
Blueprint Class処理を実装するのは大体ブループリント、Actorとしても機能する。
データのみのBlueprint親から継承したコード (ノードグラフ形式)、 変数、コンポーネントのみを格納する。
Blueprint Interfaceinputとoutputを指定するだけ関数のコレクション。
機能はブループリントに実装、クラス設定のInterfaceに指定すると引数と返り値になり、ブループリント間のデータの受け渡しを可能にする。
Blueprint Macro Libraryマクロ または内蔵グラフのコレクションを保持するコンテナ。
関数と違って処理のまとまりをコピペするのがマクロらしい。

WASD移動とカメラ移動

公式資料:入力を設定する

Input Mapping Context とInpute Actionの作成。
Input ActionとしてIA_Move(WASD移動)、IA_Look(カメラ移動)を作ってContextで設定、Character Classに実装。
公式ドキュメントだとプロジェクト設定にBindしたものをCharacter Classに実装している。
どちらもCharacter Classにカメラを配置する必要あり。

アニメーション

公式資料:ブレンド スペース
アニメーションを組み合わせて新しいアニメーションを作ることができる。
動画では1Dでアニメーションを作ったけど、応用の幅が広そう。

攻撃の時のアニメーションは RamsterZ Animations のフリーのものを使用。
有料も含めて見ていて楽しい。

ダウンロードしたものをコンテンツブラウザにドラッグするとインポート画面が出るので、Reset to Defaultを押してからスケルトンに SK_Mannequin_Skelton (UE4のモデル)を指定すると取り込める。
取り込んだものを右クリックして Retarget Animation Assets > Dulplicate and Retarget Animation Assets/Blurprint を選び、IKリターゲタにRTG_UE4Manny_UE5Mannyを指定すると、UE4のマネキンアニメがUE5のマネキンアニメに変換される。
作成したアニメーションから右クリックでCreate > Create AnimMontage でモンタージュを作成する。

調査

ここで少し脱線して Mixamo からの取り込みを試してみた。
Youtubeにいくつか動画があるのでそれらを参考にすればできたけど、時間はかかった。
取り込んで、IK Rig作って、HierarchyからChainを設定して、IK Retargeterでコンバート、という感じだった。

用語意味
SkeltonSkeltal Meshの骨格
Skeltal Meshアニメーションするメッシュ、外見、アバター
IK RigIKはInverse Kinematics(逆運動学)の略。
Skeltal Meshをベースに作成する、関節の設定?
IK Retargeter元のSkeltal Meshとは別のSkeltal Meshにアニメーションを適用するための仕組み。
それぞれに設定したIK Rigでマッピングされる?

戦闘システム

プレイヤー(Character Blueprint)

公式資料:トレースの概要
攻撃時(動画では左クリック押下時)、「Play Motage」で攻撃モーションを実行。
攻撃方法は「Sphere Trace for Objects」で衝突判定をして、「Break Hit Result」でヒットしたActorを取得し、「Apply Damage」で対象のActorにダメージを与える。
動画では「Sphere Trace for Objects」の入力値は、攻撃方向に作成したArrow Componentの世界座標と、その前方に指定分進んだ座標(ここでは100前方)、Object TypeとしてPawnを指定。

ダメージを受けたときは「Event AnyDamage」で拾えるので、ここでHPが減少する処理を入れる。
動画では「Launch Character」を使用して後退する動作も組み込んでいる。
入力値のLaunch Velocityは「Get Actor Forward Vector」のマイナス方向と「Get Actor Up Vector」を少し。
HPが0になったら「Disable Input」で入力受付を停止して、「Set Simulate Phisics」で倒れる。

エネミー(Character Blueprint)

攻撃や被ダメはプレイヤーとほぼ同じ。
エネミーには自動追尾と死亡時の消滅を追加している。

公式資料:アクタをスポーンおよび破壊する
死亡時の処理は、攻撃不可状態(攻撃可能フラグの変数で制御)にして、「Disable Movement」で動きを止めて、「Destroy Actor」で破棄=破壊=消滅する。

キャラクター自動追尾は「AI Move To」を使用。
引数はPawnにSelf、Target Actorに「Get Player Character」のPlayer Index=0。
説明を呼んでもよくわからない、Player Controllerは作ってないのだが?と思ってGoogle先生に聞いても分からなかったのでChatGPTちゃんに聞いてみた。

Unreal Engineにおいて、Player Pawnを特定できるのは、内部的にPlayer Controllerがアクティブなプレイヤーの入力を管理し、そのプレイヤーが操作するPawnを制御するためです。

Player Controllerはプレイヤーの入力を受け取り、それに基づいてPawnを制御します。通常、ゲームが開始されると、各プレイヤーに対してPlayer Controllerが生成され、そのPlayer Controllerがそのプレイヤーが操作するPawnに関連付けられます。

したがって、Get Player Characterを使用すると、Player Controllerがアクティブなプレイヤーに関連付けられたPawnを取得することができます。具体的には、Player Controllerが管理するPawnを返すため、Player Controllerが存在しない場合はPlayer Pawnを特定することができません。

このような仕組みにより、Player ControllerとPlayer Pawnの関連付けが行われるため、Player Controllerを明示的に作成することなく、Player Pawnを特定することができます。

確かに実行したらOutlinerにPlayer Controllができてた!
とりあえず1個は必ずできて、入力受付した時点で順次紐づいていくってことかな。

Wave Spawner(Actor Blueprint)

Waves Mapを作ってWave 1で2体、Wave 2で5体、Waves 3で7体のエネミーがSpawnするように設定。
For Loopで1体ずつ「Spawn Actor from Class」を使ってエネミークラスを呼び出す。
Wave 2、Wave 3に対応するため、「Delay Until Next Tick」と「Get All Actors Of Class」を使用して、0体になったらSpawn処理を呼び出してMapのIndexを進めて処理。

Widget

HPバーはProgress Barで作成。
Percentの設定をBindeしてHP比率を計算することで色の変化を実現。

ダメージを受けたときの画面効果はアニメーションで作成。
画面いっぱいのImageに色を付け、透過度の変更によるアニメーションを作成。
アニメーション作成時には、キーフレームを指した状態で透過度の右側の+を押すと設定できる。

Wave1とかWave2とかの表示はText欄にBindで変更。
ダメージ画面に使ったWidgetにText欄を追加。
表示テキストをBindしてWave Mapの現在のインデックスのkeyから取得するように実装。

調査

公式資料:ウィジェットの作成
公式資料:UMG エディタ リファレンス

Create Widget→Set→Add to Viewportで表示するのが基本の流れっぽい。
ここのSetでWidget情報を変数に取っておくと、都度再作成する必要がない。
必要なければ省けそう。

Set Input Mode Game and UI
Set Input Mode Game Only
Set Input Mode UIOnly
というのが用意されているらしい。
これは実際にゲームを作るときに使いそう。

公式資料:UMG UI デザイナのクイック スタート ガイド
公式にもHPとか弾薬管理するチュートリアルがあった。

効果音

公式資料:Unreal Engine のオーディオ

右クリックのメニューのAudioからMetaSound Souceを作る。
wavファイルの再生にランダム関数でピッチをセットすることで音に幅が出る。

右クリックのメニューのAudioからSoundAttenuationを作る。
これは減衰設定で、Wave Playerに引数で設定できる。
MetaSoundのSouceからAttenuationに設定することで、MetaSoundの再生に適用される。

動作に伴う効果音は、使うアニメーションファイルのNotifyにセット。
処理に伴う効果音は、処理の中にPlay Sound関数で組み込む。
システム音は減衰不要なのでwavファイルそのまま。

景観作り

少し地形や草を作ってみてあとは視聴のみ。
自分でもびっくりするほど興味わかなかった。
そういえばフォトリアルな風景を作ることにもあまり興味ないかも。
作ってみたい景色のチュートリアルがあれば、そのうち個別にやるかも。

アバター

メッシュを他のメッシュに変えることで見た目が変わる。
使用したアセットのメッシュはUE4だったので、アニメーションと同じでリターゲティングが必要になる。
動画ではエネミーのメッシュをランダムに設定する処理も加えていた。

  • Animation BlueprintでのClassを右クリック > Retarget Animation Assets > Dulplicate and Retarget Animation Assets/Blurprint Retargeterで、今度はUE5からUE4に変更
  • キャラクタークラスのAnim Classを新しく作った方に変更
  • モンタージュも同様にUE5からUE4にしたものを作り、攻撃モーションの設定を変更
  • 死亡時の倒れるモーションがないので、素材のフォルダで対象をすべて選択し、右クリック > Create > Physics Asset > Create and Assignで作る

マネキン、アニメーション、アバターのバージョンが揃ったもので作れば楽なんだろうな。

感想

何もわからない状態で始めたので、知らないことが多くて何度も動画を止めながら進めていて思ったより時間かかった。
他にもいくつか興味のあるチュートリアルをやって知識を増やしたい。
マーケットプレイスでゾンビを見てたらゾンビゲームが作りたくなるし、ファンタジーを見たらファンタジーを作りたくなってしまうので現実を知ろう。
今はChatGPTがあるので、もっと色々聞いてみても面白いかも。