
マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
「ミニゲームの制作過程を通してUnrealC++で開発する際の方法をざっくり知ろう」という趣旨で、全三回に分けてUnrealEngineでのミニゲーム制作について紹介しています。
前回はUnrealC++の概要について紹介したので、今回からは実際のゲーム制作内容について踏み込んでいきます!

【UE5】第一回 ミニゲーム制作で学ぶUnrealC++ 〜UnrealC++の概要 編〜
2024-05-18
▲前回の記事
▲制作したゲーム

エレキベア
猫のランゲームについて制作したのだったクマね

マイケル
今回はメインとなる
・ゲーム概要と設計
・ゲーム素材の準備
・キャラクター制御の実装
・ゲーム内容の実装
について紹介していきます。
コードは下記リポジトリにあげていますので、こちらもよければ合わせてご参照ください!
▼GitHubリポジトリ
GitHub - plasmo310 / ue5-cat-runner
▼UnrealEngineバージョン
5.3.2

エレキベア
やったるクマ〜〜〜
参考書籍

マイケル
今回実装・情報整理するにあたり、下記書籍を参考にさせていただきました!

C++でつくるUnreal Engineアプリ開発 for Windows & ...

Unreal Engine 5で極めるゲーム開発:サンプルデータと動画で学ぶゲー...

マイケル
C++でつくるUnreal Engineアプリ開発は、UE4の情報にはなりますが数少ないC++について触れられた書籍です。
Unreal Engine 5で極めるゲーム開発は通称極め本と呼ばれていて、業界内では定番書籍として扱われています。
量はありますが、一度見ておいて損はないと思います!

エレキベア
極め本はUE4版もあったクマが、UE5になってまたボリュームが大きくなったクマね
ゲーム概要と設計

マイケル
制作の話に入る前に、まずはゲームの概要と設計について紹介します。
ゲーム概要

マイケル
今回制作したゲームはシンプルな3Dエンドレスランゲームで、下記のようなルールになっています。
- 自動で前進し、ジャンプと左右移動でネコを操作してちゅ〜るを集める

- 道の端まで到着すると、曲がるとともにスピードや難易度が上がる

- トゲのブロックに当たるとゲーム終了

操作方法
操作 | キー |
---|---|
ジャンプ | Space |
左移動 | A |
右移動 | D |
しゃがむ | S |

エレキベア
トゲをよけながらちゅ〜るを集めるということクマね
設計

マイケル
プロジェクトは基本的にBlueprintは使用せず、C++メインで制作しています。
コード部分のフォルダ構成は下記になっています。
GitHub - plasmo310 / ue5-cat-runner (Source)
フォルダ | 概要 |
---|---|
Audio | オーディオ関連 |
Cat | ねこ関連 |
Data | ステージデータ関連 |
GameInstance | GameInstance関連 |
GameMode | GameMode関連 ※デフォルト |
Gimmick | ギミック関連 |
Hit | 衝突処理関連 |
Level | レベル関連 |
Pickup | 取得アイテム関連 |
Stage | ステージ関連 |
StateMachine | ステートマシン |
UMG | UI関連 |

マイケル
依存関係はざっくりと下記のようになっています。
Levelスクリプトがメインとなってゲームルールを制御しています。

▲ざっくりとした設計

エレキベア
この規模ならこれくらいがちょうどいいクマね
UI側からは見るだけで済むのは綺麗クマ
ゲーム素材の準備

マイケル
ゲームを制作にするにあたって必要な素材については大きく
・キャラ、アイテムの3Dモデル
・ステージ、エフェクトのテクスチャ
を用意しました。
ねこ、ちゅーるのモデル

マイケル
3Dモデルとしては、
・ねこ
・ちゅ〜る(取得アイテム)
の2種類をBlenderにて作成しました。

▲3Dモデル(ねこ)

▲3Dモデル(ちゅ〜る)

エレキベア
これくらいのモデルならそこまで時間をかけずに作れそうクマね

マイケル
ねこのモデルに関しては操作アクションがあるため、ボーンを設定して数種類のアニメーションも用意しています。

▲ボーン設定やアニメーション制作も行なった

マイケル
そしてこのねこのモデルとなったのは我が家の猫です・・・。
もはやこの子を3Dモデルにしたかっただけ説もあります・・・。

▲モデルとなった家の猫

エレキベア
なんて愛らしいんだクマ・・・
ステージのテクスチャ

マイケル
がっつり作ったのは3Dモデルくらいで、あとは手間をかけずにさくっと作りました。
ステージ用のテクスチャはStableDiffusionで制作しています。



エレキベア
背景とか雰囲気を出したい場合にすごく便利クマね

マイケル
今回はこれらのテクスチャを使用して、
下記のような床を繋げることでステージを生成しました。

▲一つの床・壁として使用する
エフェクトのテクスチャ

マイケル
エフェクトに関しても、下記のように簡易的なもので実装しています。
こちらはペイント、Gimpで作りました。



エレキベア
これをパーティクルとしてエフェクトを作成するクマね

▲Niagaraを使用してエフェクトを作成する

マイケル
今回のゲーム制作に必要な素材は以上になります!
あとはがんがん実装していきしょう!
キャラクター制御の実装

マイケル
まずはキャラクターの実装から始めます。
今回はThirdPersonテンプレートからC++プロジェクトを作成し、下記のようにキャラクターとカメラが配置された状態から始めました。

▲キャラクター、カメラが設定された状態

マイケル
ThirdPersonテンプレートでのプロジェクト作成については前回の記事でも少し触れていますので、あまり触ったことがない方はこちらもご参照ください。

【UE5】第一回 ミニゲーム制作で学ぶUnrealC++ 〜UnrealC++の概要 編〜
2024-05-18

エレキベア
ここからねこの動きを作っていくクマね
入力処理周り

マイケル
まずは入力処理について実装します。
今回のゲームはシンプルで、下記入力に対してそれぞれのアクションを行います。
ねこ入力アクション定義
入力キー | アクション |
---|---|
スペース | ジャンプ |
A | 左回転 |
D | 右回転 |
S | しゃがむ |

エレキベア
デフォルトはTPSのような操作になっているクマから、それを今回のゲーム形式に変えるクマね

マイケル
UE5ではEnhancedInputというシステムを使用して入力制御を行います。
これはUnityでいうInputSystem的なもので、アクションに対して操作を割り当てることで制御するものです。
UnrealEngineドキュメント - EnhancedInput

マイケル
イメージとしては下記のように、アクションの数だけInputActionを作成し、InputMappingContextで入力操作と紐づけることで定義します。
設定方法の詳細については公式ドキュメントを参照しましょう!

▲InputActionの作成

▲ジャンプアクションの例

▲InputMappingContextの作成

▲アクションに対して入力操作を割り当てる

エレキベア
これで入力操作に対して各アクションが割り当てられたクマね

マイケル
あとはCharacterクラス内でこれらをUPROPERTY設定できるようにして、アクション処理を定義した関数と紐づければ完了です!

▲Blueprint内で入力アクションを設定する

エレキベア
これでC++側で入力処理を制御できるようになったクマね
ステート処理周り

マイケル
次にステート処理についてですが、今回は下記のようなステートを定義しました。
ねこステート定義
状態 | ステート名 |
---|---|
Wait | 待機 |
Run | 走る |
Jump | ジャンプ |
Rotate | 左右回転 |
Squat | しゃがむ |
TurnCorner | 角を曲がる |
Dead | 死亡 |

エレキベア
入力アクション+αで定義したクマね

マイケル
ステートの制御は今回は独自のステートマシンクラスを作成して使用しています。
ステートベースのシンプルな制御クラスです。
plasmo310 / ue5-cat-runner - StateMachine.h
plasmo310 / ue5-cat-runner - StateBase.h

エレキベア
Unity開発で使っていたのを移植したクマね

マイケル
使い方は下記のようにStateBaseクラスを継承した各ステートクラスを作成し、ステートマシンに設定することで使用します。
▲ステートのenum定義
▲StateBaseを継承したクラスを定義(Waitステートの例)
▲ステートに対する実装(Waitステートの例)
▲ステートマシンへの設定と操作

エレキベア
これで各ステートの制御を分割して記述しやすくなったクマね

マイケル
もし独自クラスを作成したくない場合は、下記記事で紹介した
Sample01: enumを使用した実装 のように、Tick関数内でswitch文で切り替える方式を使用するといいと思います。

【Unity】カニの動きで学ぶ有限ステートマシン(FSM)【ゲームAI】
2021-12-30
トランスフォーム制御周り

マイケル
次にトランスフォーム制御についてですが、こちらは
位置:Location(FVector)
回転:Rotation(FRotator)
を使用して制御します。
GetActorXXX、SetActorXXXといった関数が用意されているので、そちらを使用して制御を行いましょう。

エレキベア
名称が違うだけでUnityと操作感はあまり変わらないクマね
アニメーション制御

マイケル
最後にアニメーション制御についてですが、UE5ではAnimationBlueprint (以降ABP)というものを作成して設定します。
参考:
UnrealEngineドキュメント - アニメーションブループリント

▲AnimationBlueprintの作成

▲キャラクターBP内でABPを設定して紐づける

マイケル
ABP内ではステートマシンを作成することができ、特定条件でアニメーションを遷移させるといった設定をすることができます。

▲ステートマシンを作成して定義できる

▲作成したステートマシンの実装

エレキベア
UnityでいうAnimationControllerクマね

マイケル
この遷移条件も通常はABP内でノードを組み立てる必要があるのですが、UAnimInstanceクラスを継承したクラスを親クラスにすることで、ロジックをある程度C++側に寄せることができます。
下記は各ステートに遷移するフラグをBlueprint側に公開する例です。
▲アニメーションステート遷移のフラグを公開する
▲フラグの設定(※今回はねこのステートを見るだけのシンプルな条件)

▲作成したクラスをABPの親クラスに設定

マイケル
これでABP内の遷移条件内でフラグを参照できるようになります!


エレキベア
今回はシンプルな条件クマが、複雑な条件になるとC++に寄せた方がいろいろと恩恵がありそうクマね
キャラクター実装完了

マイケル
ここまででキャラクターが入力操作に応じて操作できるようになりました!



エレキベア
あとはゲームルールを実装すれば遊べそうクマね
ゲーム内容の実装

マイケル
キャラクターの実装が完了したところで、ゲーム内容の実装に入ります。
ゲームシーケンス制御

マイケル
まずゲームのシーケンス制御についてですが、こちらはキャラクターと同様に独自のステートマシンクラスを使用してステート定義することで制御しています。
ゲームステート定義
状態 | ステート名 |
---|---|
Ready | 準備 |
Play | プレイ中 |
End | 終了 |
Result | リザルト |

▲ゲームの流れのステートになる

マイケル
問題はこれをどのクラスに定義するかですが、UnrealEngineではレベルBPというレベルを制御するBlueprintが用意されており、こちらに定義することにしました。
ALevelScriptActorクラスを継承したクラスを作成することで、親クラスを差し替えることができます。
参考:
UnrealEngineドキュメント - Levelブループリント
▲レベルクラスの作成
▲キャラクターと同様、ステートを定義して実装する

エレキベア
あとは各ステートに対して処理を実装すれば制御できそうクマね
ステージレベル情報の管理

マイケル
今回のゲームでは、一定距離進むごとにステージの難易度が上がる設計にしています。
このようなステージレベル情報の管理方法として、DataTableを使用することにしました。
これはCSVデータと連携して管理することができるので、表形式でデータ管理したい場合に有用です。
UnrealEngineドキュメント - データ ドリブン ゲームプレイ要素

▲DataTableを使用して情報を管理することができる

エレキベア
Unityだと有料アセットでしか見たことないクマから、デフォルトで用意されているのはありがたいクマね

マイケル
作成方法も簡単で、FTableRowBase構造体を継承した構造体クラスを作成し、
定義に合わせたCSVファイルを用意してD&Dするだけで作成できます。
▲構造体データの定義

▲データに合わせたCSVを定義する

エレキベア
なんて簡単なんだクマ・・・

マイケル
C++側で利用する方法も簡単で、下記のようにUDataTableクラスをUPROPERTYで設定できるようにしてFindRow関数を呼び出すことで対象行のデータが取得できます。

エレキベア
これでデータ周りの管理は問題なさそうクマね
ステージの生成処理

マイケル
次にステージ生成処理についてですが、こちらは冒頭でも紹介した床・壁のモデルを繋げることで生成しています。
道の端には左右へ曲がる角の床も用意しておいて、進行に合わせて道単位で生成・破棄を行っています。

▲ステージを生成してギミック・アイテムを配置する

▲配置する単位の床・壁モデル

▲曲がり角用のモデルも用意しておく

エレキベア
簡単なロジックで生成できそうクマね

マイケル
詳細な生成処理については省略しますが、ステージ生成用のStageGeneratorというアクタを用意して必要な情報を設定することで処理を実装しました。
▲ステージ生成情報の定義
▲床のスポーン処理

エレキベア
これでステージ生成も制御できるようになったクマ〜〜
衝突判定

マイケル
最後に、プレイヤーとギミック・アイテムの衝突処理についてです。
こちらは衝突した対象によってスコアの加算・死亡といった処理を行います。

▲ギミックやアイテムにはコライダを設定している

エレキベア
衝突処理のイベントをどう受け取るかクマね

マイケル
これには各コライダのコンポーネントに用意されたイベントに対して処理を紐づけることで検知できます。
今回はキャラクターのCapsuleComponent内、OnComponentBeginOverlapイベントに対して処理を設定しました。
▲衝突イベントの設定

▲BP上で操作できるイベントは大体C++側からも設定できる

マイケル
衝突した際のアクションについては、別途クラスを作成してそちらで管理するようにしています。
この辺りは好みにもよるので、アクタに直接書くなど好きに実装しましょう。
▲衝突対象からはヒットした情報のみ返す
▲受け取ったヒット情報から処理を行う

エレキベア
これで衝突処理もクリアクマ〜〜〜
ゲーム実装完了

マイケル
以上でゲーム内容の実装も完了です!
ここまでで一応ゲームとして遊べるようになりました。

▲ステージが生成され、アイテム等も取得できる

エレキベア
やったクマ〜〜〜
おわりに

マイケル
というわけで今回はUnrealC++を使用したキャラクター制御とゲーム内容の実装についてでした!
どうだったかな??

エレキベア
いろいろ覚えないといけないことはあるクマが、慣れればUnityと同じような感覚で実装できたクマね

マイケル
Unityの機能と紐づけて考えると理解しやすかったね。
それとUnrealEngineの情報はブループリントによる実装が多いから、それとC++実装を関連づける知識は必要そうだと感じました。

マイケル
次回はこのゲームにUI・エフェクト・サウンドなど味付けして仕上げていきます!
お楽しみに!!

エレキベア
クマ〜〜〜〜〜〜
【UE5】第二回 ミニゲーム制作で学ぶUnrealC++ 〜キャラクター・ゲーム実装 編〜 〜完〜

【UE5】第一回 ミニゲーム制作で学ぶUnrealC++ 〜UnrealC++の概要 編〜
2024-05-18

【UE5】第二回 ミニゲーム制作で学ぶUnrealC++ 〜キャラクター・ゲーム実装 編〜
2024-05-18

【UE5】第三回 ミニゲーム制作で学ぶUnrealC++ 〜UI・仕上げ実装 編〜
2024-05-18