UE4の勉強記録

UE4の勉強の記録です。個人用です。

「Unreal Engine4.xを使用してRPGを作成する」3.1.2~3.1.3を勉強する

<前文>

f:id:kazuhironagai77:20190512203528p:plain

たまたまですが前回までの勉強でplayer pawnクラスの作成が丁度終わりました。3章も半分くらいは終わったのかなと教科書で確認したら最初の節の最初の小節が終わっただけでした。

f:id:kazuhironagai77:20190512203601p:plain

3章ってこんなに長かったのですね。

何処を勉強しているのか後からブログを見て確認出来る様に上記の各節を以下に示すように訳しそれを利用して何処を勉強しているのかを明確に表記する事にしました。

f:id:kazuhironagai77:20190512203619p:plain

<本文1

3.1.2 GameMode Classの作成

<目的>

新しいGameModeクラスを作成します。

<方法と結果>

<Step.0>

前回まで使用していたCh2をそのまま使用します。

<Step.1>

GameModeクラスを作成します。教科書ではGameModeクラスから派生していますがGameModeBaseクラスからではいけないのでしょうか?いいと思うのですが確証がないのでGameModeから作成します。

f:id:kazuhironagai77:20190512203748p:plain

f:id:kazuhironagai77:20190512203805p:plain

f:id:kazuhironagai77:20190512203816p:plain

と出来ました。

<Step.2>

コンストラクターを追加します。

f:id:kazuhironagai77:20190512203855p:plain

f:id:kazuhironagai77:20190512203905p:plain

f:id:kazuhironagai77:20190512203912p:plain

教科書に書かれているコードを追加しました。念のためにビルドしてみましたが大丈夫でした。

これらのコードはコンストラクターの作成のためで特に注目すべき点はないように思われます。

そのコンストラクター内でDefault Pawn Classを指定しています。

<Step.3>

作成したRPGGameModeクラスをDefault Pawn Classに指定します。

教科書の指定の通りにコンパイルした後に、Default GameModeをRPGGameModeに指定します。

f:id:kazuhironagai77:20190512203940p:plain

ここでDefault Pawn Classを見てみるとRPGCharacterに成っていました。上記の方法でDefault Pawn Classを指定出来るのですね。Default Pawn Class のUE4のAPIを見てもそんな事は良く分からないですがこうやって使用方法を見せてくれると一発で理解出来ますね。ところでHUDクラスなどの他のクラスもこれと同じ方法で指定できるのでしょうか?

Googleで検索してみると、このサイトにしっかり例が載っていました。

f:id:kazuhironagai77:20190512204016p:plain

Setting a HUD within the GameMode class より引用

出来るようですね。

<Step.4>

RPGGameModeクラスからBPクラスを派生する。

さらに教科書を読んだらこのクラスからBPを派生してそれをGameModeとして使用するとありました。ウーン。先に言って。

f:id:kazuhironagai77:20190512204112p:plain

教科書の作り方とは違いますがRPGGameModeからBPクラス、DefaultRPGGameModeを作成します。

Classesの項目を見てみると明らかに教科書の項目よりも沢山ありますね。

f:id:kazuhironagai77:20190512204138p:plain

やはり、GameModeクラスからではなくGameModeBaseクラスから派生すべきだったでしょうか?まあ、いいです。これで出来るところまで先に進みます。

と思ったらこの節はこれでお終いでした。

<考察>

それぞれのStepについてその仕組みや目的、裏にある考え方についてなど考察します。

<Step.1>

GameModeクラスを作成しました。確かGameModeBaseクラスは普通のゲームを作成する場合GameModeクラスはオンラインでサーバーとやり取りするゲームの場合と勉強したのですが、今回はあえてGameModeクラスで作成してみました。Publicで作成していますがPrivateだとアクセス出来ない問題が生じたと思います。

UE4C++で敢えて作成するメリットは何かあるのでしょうか?勿論C++の方が速い、プログラマーに分かり易いなどの一般的なメリットがある事は承知していますがそれ以上のメリットがあるか不明です。BPで作成しても良い様な気がします。

<Step.2>

Step.2 ではコンストラクターを追加しました。UE4コンストラクターで以下に示すパラメーターを使用する場合と

f:id:kazuhironagai77:20190512204216p:plain

何もパスしない場合がありますがどう違うのかちょっとだけ調べて見ます。

一瞬で見つかりました。このサイト(Constructor with or without FObjectInitializer)の説明によると、

f:id:kazuhironagai77:20190512204309p:plain

Constructor with or without FObjectInitializerより引用

UE4C++における正しいコンストラクターの書き方は3種類ありパラメーターとしてconst class FObjectInitializer& ObjectInitializerを使用する方法とパラメーターに何も書かない方法はどちらも正しいそうです。ちなみにUE4C++におけるもう一つの正しいコンストラクターの書き方はコンストラクターを書かない方法だそうです。

同じだったら毎回書いた方が勉強になるような気がしますがUE4C++の進化の方向として普通のC++に近づけると言う目標がありその場合はパラメーターに何も書かない方が良いみたいです。

DefaultPawnClassの指定方法については、方法と結果の所で十分な検証をしているのでここでは述べません。

<Step.3>

作成したRPGGameModeクラスをDefault Pawn Classに指定しました。特に考察する事はありません。

<Step.4>

RPGGameModeクラスからBPクラスを派生してそれをGameModeとして使用しました。

うーん。敢えてUE4C++で作成したGameModeクラスをBPに変換してからGameModeとして使用するのですね。深い。プログラマーはGameModeクラスをUE4C++から調節してデザイナーはBP側から調節する事を可能にする事でゲームの製作の効率を上げると言う事でしょうか?ゲーム作成におけるソフトウェアデザインの実践的な適用、現場のノウハウなのでしょうか。

このひと手間は、ゲームの完成度に大きく影響しそうな気がします。忘れないようにしたいです。

<まとめと感想>

ウーン。どうまとめたら良いのか?

取りあえず、defaultのゲームモードをDefaultRPGGameModeに変更してコンパイルしてみました。

f:id:kazuhironagai77:20190512204415p:plain

何も問題なくコンパイル出来ました。

これではあまりに短いので次の節も勉強します。

<本文2

3.1.3 Skinned Meshの追加

<目的>

Skinned Meshを追加します。

<方法と結果>

<Step.1>

ThirdPersonのプロジェクトを作成してそのプロジェクトからThirdPerson Character BPをこのプロジェクトにマイグレートします。

f:id:kazuhironagai77:20190512204529p:plain

しました。

<Step.2>

RPGCharacterクラスからポーンのためのBPを作成します。それをFieldPlayerと名付けます。

f:id:kazuhironagai77:20190512204558p:plain

作成しました。

<Step.3>

FieldPlayerのskeletal meshにSK_Mannequinを選択します。

f:id:kazuhironagai77:20190512204621p:plain

しました。

<Step.4>

FieldPlayerのAnimationにThirdPerson_AnimBPを選択します。

f:id:kazuhironagai77:20190512204719p:plain

うーん。これでいいんでしょうか?ちょっとだけ不安です。

<Step.5>

キャラクターのメッシュの位置を調節します。

f:id:kazuhironagai77:20190512204749p:plain

以下の様に調節しました。

f:id:kazuhironagai77:20190512204814p:plain

f:id:kazuhironagai77:20190512204824p:plain

<Step.6>

GameModeのBP (DefaultRPGGameModeの事 )を開いてPawnをFieldPlayer BPに変更します。

f:id:kazuhironagai77:20190512204905p:plain

変更しました。

この状態で実行するとキャラクターが表示されると教科書に記載されていたのでPlayを実行してみました。

f:id:kazuhironagai77:20190512204925p:plain

見事に表示されています。が、全く動きません。

<Step.7>

キャラクターを操作出来る様にします。

f:id:kazuhironagai77:20190512204954p:plain

教科書の指定通りに設定しました。

f:id:kazuhironagai77:20190512205257p:plain

普通に動いてます。

<考察>

<Step.1>

Third Personのプロジェクトを作成してそのプロジェクトからThird Person Character BPをこのプロジェクトにマイグレートしました。

特に考察する事もないです。この為だけにプロジェクトを作成したのですが、ちょっと勿体ない気がします。

<Step.2>

RPGCharacterクラスからポーンのためのBPを作成し、FieldPlayerと名付けました。

これも本文1の考察の<Step.4>と同じ理屈だと思われます。

<Step.3>

FieldPlayerのSkeletal meshにSK_Mannequinを選択しました。

実はこのStepと次のStepが一番良く分かってない所です。まずSkeletal meshが何なのか良く分かっていません。Blenderで作成した3DモデルをUE4にインポートした時に作成されるクラスと言う事は分かっていますがプログラムとして厳密な意味で理解した事はありません。せめてコード位は見て置こうと調べたのですが見つからなかったです。Skeletal meshで検索したらあまりにも多くのコードが該当して実装しているコードが分かりませんでした。

f:id:kazuhironagai77:20190512205323p:plain

Skeletal meshに付属しているこれらのパラメーターについても実際のコードから確認したかったですが今回は諦めます。

<Step.4>

FieldPlayerのAnimationにThirdPerson_AnimBPを選択しました。

このThirdPerson_AnimBPはAnimation BPクラスから派生したクラスなのですがAnimation BPクラスが良く分かっていません。調べて見ました。

このサイトによると、

うーん。今度勉強する事にします。

<Step.5>

キャラクターのメッシュの位置を調節しました。これは前回までの勉強で明らかになったようにUE4エディター内ではZ軸は時計回りでした。キャラクターの正面は慣習に従いX軸に沿って指定し直しました。

<Step.6>

GameModeのBP (DefaultRPGGameModeの事 )を開いてPawnをFieldPlayer BPに変更しました。

特に考察する事はないです。

<Step.7>

キャラクターを操作出来る様にしました。

この辺はBPで散々勉強した所なので特に考察する事はないです。

<まとめと感想>

遂にPlayer Pawnが完成しました。今回の内容は特に深く考察する部分が少なくどうやったらいいのか悩みました。あまり深く考えずに先に進むのもいいかもしれません。