第2回目は何かを作ってみた、というものではなく、UE4の基本となるフレームワークを自分なりに解釈したものを書いていこうかと思います。
ゲームエンジンはそのフレームワークを理解するのが重要だと考えています。
フレームワークを理解すると、自分がやりたいことをどうやって実現するのかひらめきやすくなると思います。
今回は自分の理解を深めるため、および間違いがあったら突っ込んでもらうために記事を書きます。
なお、元ネタはUE4ドキュメントの以下のページです。
https://docs.unrealengine.com/latest/INT/Programming/Gameplay/Framework/index.html
また、UE4のソースコードとしては以下のフォルダに今回説明するもののほとんどが入っています。
Engine/Source/Runtime/Engine/Classes/GameFramework
では、進めていきましょう。
・Actor
ActorはUE4のオブジェクトの基本となるクラスです。
ヘッダはActor.hです。
他のゲームエンジンでいうなら、UnityならGameObject、SourceならEntityがこれに当たるのではないかと思います。
ゲーム中に生成される物質的オブジェクト、非物質的オブジェクト、概念なんかも含めてこのクラスを継承しているものと思われます。
このクラスを継承しているものは基本的にゲーム中にUpdateが行われるようです。
また、Actor同士で親子構造を作成することができます。
ユーザはゲーム中に自前の何かを配置したい場合、必ずこのクラスを継承しなければなりません。
・Level
これはクラスとしては存在していないのかな?ですが、とても重要な存在です。
LevelはいわゆるSceneです。といっても、Sceneという概念はゲームエンジンやフレームワークによって意味が変わってくるのでこの説明では不十分でしょう。
昔、高専時代の物理の教師は、物理的に力が働くには場が重要だ、と再三再四語っていました。
例え話として出てきたのは、清原がサッカー場にいても力は働かないけど、野球場にいれば力が働く、ということでした。
Levelとはまさにこの”場”という概念と言っていいでしょう。
この”場”には時間が流れ、物理的な力が働き、様々なルールが存在し、物質が配置されているわけです。
たとえ地面がなくても、真っ暗闇でもLevelは”場”を提供します。
UE4では.umapというファイルで存在しているのがLevelです。
Levelは必ず存在し、独自のBlueprintを持っています。
新しいLevelを生成する場合は[File] -> [New Level]で生成します。
また、LevelのBlueprintを編集する場合はツールバーのBlueprintボタン -> [Open Level Blueprint]で編集できます。
・GameMode
GameModeはゲームのルールや状態の設定を行う概念的なクラスですが、これもActorを継承しています。
つまり、ゲームに配置されるものということになります。
基本的に、Level内に1つだけインスタンスが存在します。
切り替えは可能なようですが、インスタンスは1つだけしか存在しません。
新規作成する場合は上図のようにBlurprintボタン -> [GameMode Create]を選択するか、World Settingsボタンを押してWorld Settingsプロパティの[GameMode Override]の[New]ボタンを押すかするとBlueprintとして作成することができます。
GameModeはゲームのジャンルや、同じゲーム内でもゲームルールによって異なる実装を行います。
わかりやすい例としてはマルチプレイヤー対戦モードのFPSでしょうか。
あるFPSではマルチ対戦用マップでTownという名前のマップが存在するとしましょう。
UE4では、このTownというマップがLevelとなります。
このマップではチームデスマッチ、ドミネーション(陣取り)、CTFといったルールで対戦を楽しむことができます。
対戦ルールによって参加可能人数も変わってきます。
GameModeとは、このルールや参加可能人数なんかを制御します。
GameModeはルールなどに関する状態も管理しますが、基本的にはこれはGameStateが保持するようです。
また、GameModeを作成するとデフォルトで生成するPawnやControllerなんかも設定できます。
通常、これらはGameModeによって異なるクラスが割り当てられ、生成されるインスタンスももちろん異なってきます。
これらの基本的なクラスはWorld Settingsプロパティの[Selected GameMode]で設定可能です。
・Pawn
Pawnは基本的に物質的な表現をするためのActorです。
通常はユーザが見ることが出来て、コントローラによる操作が許可されています。
PawnはControllerと1対1の組み合わせを持ちます。
ControllerがPawnを保持するという形がUE4の基本となるようです。
ただ、PawnからControllerを取得することも可能なようです。もちろん、ControllerからPawnも取得が可能です。
Pawnの生成はBlueprintsボタン -> [Pawn Create]か、Blueprintsボタン -> [New Class Blueprint]を選択後、ダイアログでPawnを継承して作成します。
注意点として、前者の方法でBlueprintを生成するとPawnではなくDefaultPawnを継承することになります。
DefaultPawnはPawnの特殊クラスで、自分自身としてただの球を配置し、デフォルトではカメラの操作が可能になっているものです。
自分自身でしっかりしたPawnを作りたい場合、後者の方法でただのPawnを継承したBlueprintを生成してください。
・Controller
Controllerは基本的にAIControllerとPlayerControllerのどちらかです。
AIControllerはその名の通りAIによる操作を提供します。
PlayerControllerはゲームプレイヤーがパッドやキーボードなどの入力による操作を提供します。
なお、GameModeに設定されるデフォルトのControllerはPlayerControllerでなければなりません。
ControllerもやはりActorを継承しています。
・Character
やはりPawnを特殊化したクラスで、主に人型のスケルトンメッシュとそれ用のカプセル判定を持っています。
CharacterはJumpやCrouchといった、FPSではよく使われる機能も持っています。
重力の影響を受け、床に合わせた移動やジャンプを行うことが容易に可能です。
普通のジャンプアクションゲームのような物を作るのであれば、プレイヤーキャラクタをこのクラスで使ってみればよいでしょう。
・HUD
ゲーム画面に出てくるHUD(Headup Display)を制御するクラスで、HUDの描画イベントなんかも存在しています。
PlayerControllerから取得することができるため、デフォルトのHUDクラスはデフォルトのPlayerControllerから取得できます。
1Levelにつき1つだけHUDクラスを作成することができるようです。
主なクラス群はこんな感じでしょうか。
他にも重要なクラスや概念はあるのでしょうけど、今のところ理解できてる(と自分で思ってる)のはこんなところです。
知っておくべきクラスやこのクラスの説明が間違ってるなどありましたらお知らせいただけるとありがたいです。