UE4の勉強記録

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

「Unreal Engine4.xを使用してRPGを作成する」の足りない部分を作成する。キャラクターを追加するPart2

<前文>

f:id:kazuhironagai77:20191117214559p:plain

AIとかDeep learningまたはビックデータなどのデータサイエンスはコンピューターサイエンスの中でも最も流行っている分野ですね。でも私はあんまり信じていません。理由は簡単で、アメリカ人の性格から考えて、そんなに効果があるならば、他人に教える訳ないからです。そういう皮肉れた見方をしていると、やっぱり否定的な意見が目に留まる訳で、あるサイトに書かれていたのが、企業がデータ科学者(data scientists)を雇って、収益が上がったケースは15%しかない。と書かれていました。そのサイトによると、その主な理由は、

  • 個人情報との関係で必要なデータが使用出来ない。
  • データ科学者(data scientists)の出した予測は、他の部署では常識だった。(大企業だと部署毎に扱えるデータが違うため、このような事が起きる。)

とありました。まあ、必要なデータがそろわないから分析も出来ないわけですね。

これってどうなんでしょうね。日本だとまだ、罰則ないから違法でも構わないと、強引に必要なデータを集めて分析して、結果だけ内緒で社内で使用したりする会社もありそうです。

まあ、それはともかく、こんな風にデータサイエンスに対してネガティブに見ている私でも、データの可視化だけは興味があります。

例えば、紙のグラフはf(x)の関数の挙動しか描く事しかできませんが、パソコン内のグラフならば、3次元上に描けるので、見やすいかどうかはともかく、f(x,y)のグラフまで描けます。でも、科学的に重要な式って大体、f(x,y,z,t)みたいにもっと変数がありますよね。これらを一発で可視化出来る方法がないんでしょうか?

とか考えています。

そして、ひょっとするとUE4がそういうデータの可視化に対して凄い威力を発揮したりするではと、思ったりもしています。

それでは、今週の勉強を始めます。

<本文>

前回は、プレイヤー用のキャラクターを

f:id:kazuhironagai77:20191117214654p:plain

から、選択する方法を解明しました。

今回は、

  1. 実際のプロジェクトにModular RPG Heroes Polyartを追加して、そのプレイヤーの3Dモデルを変更します。
  2. 実際のプロジェクトでは、FieldPlayerBPクラスを使用してプレイヤーが操作するキャラクターを作成していますが、これをどのように作成したのかを覚えていないので、その復習もおこないます。
  3. 最後に、Modular RPG Heroes Polyartに武器を装備する方法も調査します。

を行います。

<Modular RPG Heroes Polyartのキャラクターに変更する>

前回と全く同じ方法で行います。もっと効率が良い方法はありそうですが、失敗した時のリスクが許容範囲を超えてしまう可能性があるし、前回の復習にもなりますので今回は新しい方法を試す事はしません。

1.ModularBodyPartsをプロジェクトに追加する。

f:id:kazuhironagai77:20191117214815p:plain

追加しました。

2.FieldPlayerBPSkeletal Meshを変更する。

失敗した時のためにFieldPlayerのコピーを取っておきます。

f:id:kazuhironagai77:20191117214902p:plain

Skeletal MeshをApprenticeSKに変えます。

f:id:kazuhironagai77:20191117214921p:plain

テストします。

f:id:kazuhironagai77:20191117214939p:plain

前回と同じようにプレイヤーのキャラクターがApprenticeSKに代わりました。

前回と同じ様に、モーションもテストします。

f:id:kazuhironagai77:20191117215004p:plain

今回は、Combo03_DoubleSwordAnimを使用してみます。

f:id:kazuhironagai77:20191117215022p:plain

スクリーンショットでは、滑らかな動きを見せられませんが綺麗に動きました。

3.SK_MannequinのスケルトンであるUE4_Mannequin_SkeletonApprenticeSKのスケルトンであるUE4_Mannequin_Skeletonを関連づける。

ここら辺からちょっとやり方が曖昧な部分があります。丁寧に進めていきます。

ThirdPersonRunを開きます。ThirdPersonRunはApprenticeSKから使用したいモーションです。

f:id:kazuhironagai77:20191117215108p:plain

エディターの右上にあるタブからSkeletonを選択します。

f:id:kazuhironagai77:20191117215130p:plain

Retarget Manager内のSelect RigからHumanoidを選択します。

f:id:kazuhironagai77:20191117215148p:plain

セーブします。

今度はApprenticeSKを開き、Skeletonを選択します。

f:id:kazuhironagai77:20191117215411p:plain

ThirdPersonRunのSkeletonでやった事と同様にここでもSelect RigにHumanoidを選択します。

f:id:kazuhironagai77:20191117215507p:plain

セーブします。

ThirdPersonRunを右クリックしてRegarget Anim Assetsを選択しDuplicate Anim Assets and Retargetを選択します。

f:id:kazuhironagai77:20191117215540p:plain

すると、Select Skeletonエディターが開きます。Select Skeleton の項目にUE4_Mannequin_Skeletonを選択すると右のTarget画面にナイトのモデルが表示されます。

f:id:kazuhironagai77:20191117215654p:plain

二つのモデルの上腕の位置が同じではないので、これを直します。一端Select Skeletonは閉じます。

ThirdPersonRunからskeletonにいって腕の位置を変更します。

f:id:kazuhironagai77:20191117215723p:plain

Modify Poseを押します。

f:id:kazuhironagai77:20191117215742p:plain

あれ、こんな画面、先週は表示されたんでしょうか?

UseCurrentPoseを取りあえず選択します。

f:id:kazuhironagai77:20191117215804p:plain

もう一度、ThirdPersonRunからDuplicate Anim Assets and Retargetを選択します。

f:id:kazuhironagai77:20191117215841p:plain

今度は両方のモデルが同じポーズを取っていますね。ちょっと安心です。

Retargetを押します。

f:id:kazuhironagai77:20191117215910p:plain

以下に示すように、ApprenticeSKのためのThirdPersonRunが作成されました。

f:id:kazuhironagai77:20191117220002p:plain

テストします。

いつものように、FieldPlayerのmeshのAnimation内のAnim to PlayにThirdPersonRunをセットします。

f:id:kazuhironagai77:20191117220024p:plain

Playを押してゲームを実行します。

f:id:kazuhironagai77:20191117220108p:plain

キャラクターが綺麗に走り始めました。ここまでは成功です。

4.ApprenticeSK のためのThirdPerson_AnimBPを作成する。

まずは、ThirdPerson_AminBPのためのフォルダーを作成します。FiledPlayerMotionsと名付けました。

f:id:kazuhironagai77:20191117220139p:plain

残りの全部のAnimation SequenceもApprenticeSKのために変換します。

f:id:kazuhironagai77:20191117220159p:plain

出来ました。

ThirdPerson_IdleRun_2Dを作成します。

f:id:kazuhironagai77:20191117220231p:plain

前回と同じようにMyThirdPerson_IdleRun2Dと名付けました。

前回と全く同じ方法で軸の設定をしました。

f:id:kazuhironagai77:20191117220335p:plain

グラフの左端にThirdPersonIdle、左から3分の1の所にThirdPersonWalk、そして右端にThirdPersonRunを配置します。

f:id:kazuhironagai77:20191117220402p:plain

これで完成です。

ApprenticeSKのためのThirdPerson_AnimBPを作成します。

f:id:kazuhironagai77:20191117220445p:plain

前回と同じ方法で作成しました。中身も作って行きます。

f:id:kazuhironagai77:20191117220505p:plain

作り方は全く前回と同じなので結果だけ示していきます。

f:id:kazuhironagai77:20191117220653p:plain

EventGraph内を作成していきます。

f:id:kazuhironagai77:20191117220714p:plain

この部分も前回と全く同じです。

これで全部完成しました。

テストします。

FieldPlayerのmeshのAnimation内のAnim to PlayにMyThirdPerson_AnimBP_Cを選択します。

f:id:kazuhironagai77:20191117220846p:plain

Playを押してゲームを開始します。
f:id:kazuhironagai77:20191117220809p:plain

キーボードの操作に合わせて綺麗に動きますがジャンプはしません。

f:id:kazuhironagai77:20191117220922p:plain

そもそもジャンプを作成していませんでした。

まあいいでしょう。一応これで完成です。

<FieldPlayerBPクラスの復習>

実際のプロジェクトでは、FieldPlayerBPクラスを使用してプレイヤーが操作するキャラクターを作成していますが、これをどのように作成したのかを覚えていないので、その復習をおこないます。

1RPGCharacter.hを読む

取りあえず色々やる前に、FieldPlayerBPクラスの親クラスであるRPGCharacterクラスを読んでみます。

ヘッダーファイルから行きます。

f:id:kazuhironagai77:20191117220958p:plain

まず、この二つの変数がいきなりぶっこまれています。何もモードを指定していなので多分デファルトでPrivateになっているのでしょう。クラスだし。それで「BlueprintReadOnlyとするとPrivateなのでブループリントからアクセスは出来ません。」とエラーになってコンパイル出来ないので、metaでAllowPrivateAccess  = ”true”としているんですね。

そう言えば、このPrivateの変数にUPROPERTYでBlueprintReadOnlyを付けるとコンパイルエラーになる事と、それを避けるためにmeta = (AllowPrivateAccess = “true”)と書く事は、UE4C++で一番最初に教えるべき内容の一つだと思いますが、それを説明している教科書って見た事ないですね。

そもそもUE4C++で作成されたクラスは、ブループリントで派生して使用する予定なのになんで最初からprivateで書くのかが不明ですが、これこそ教科書で説明してほしいですね。

よし。自分で調べて見ます。

以下に示す変数を別の壊しても問題ないプロジェクト内のあるクラスで作成しました。

f:id:kazuhironagai77:20191117221341p:plain

そのUE4C++からブループリントを作成します。

そのブループリントのイベントグラフを開き、変数testAllowPrivateAccessを呼び出してみます。

以下に示すように、ブループリントからアクセス出来ます。

f:id:kazuhironagai77:20191117221402p:plain

次はこれで試してみます。

f:id:kazuhironagai77:20191117221518p:plain

今度は呼び出せませんでした。

これは、まあ当然ですね。

次は、meta = (AllowPrivateAccess = "true")を抜いた場合です。確かコンパイルエラーになったはずです。

やっぱりエラーになりましたが、原因が書かれていません。

f:id:kazuhironagai77:20191117221618p:plain

f:id:kazuhironagai77:20191117221626p:plain

エラーの理由が不明です。

あっ、そうでした。UE4C++由来のエラーはUE4エディターからコンパイルしないと原因不明になってしまうんでした。

f:id:kazuhironagai77:20191117221710p:plain

はい。しっかりエラーの原因も表示されました。

よし、こっから調査に入ります。

f:id:kazuhironagai77:20191117221902p:plain

まずはprivateをprotectedに変更します。

f:id:kazuhironagai77:20191117221941p:plain

勿論、ビルドは成功です。

f:id:kazuhironagai77:20191117222013p:plain

今回は普通にアクセス出来ます。

うーん。こっちでいいと思うんですが。

ここまで書いて閃きました!

この変数を持つクラス、UEC++クラスの親クラスに成る可能性もあると思います。その時にその子クラスからアクセス出来ないようにしたい場合は、privateにするしかない訳です。

試してみました。

Protected の場合はtestAllowPrivateAccessの変数を持つクラスの子クラスからtestAllowPrivateAccessにアクセスしてもコンパイルエラーには成りません。しかしprivateに変更した途端、コンパイルエラーに成りました。

分かりました。

まとめます。

UE4C++である変数を作成する時に、どうしてもブループリントからその変数にアクセスする必要がある変数があります。その変数は、その変数を持つクラスから派生したクラスからもアクセスしてほしくない変数なのですが、どうしたらいいでしょうか?

その答えが

BlueprintReadOnly、meta = (AllowPrivateAccess = "true")

です。

UPROPERTYだけで、こんなに時間がかかってしまいました。

宣言したクラスも見ていきましょう。

f:id:kazuhironagai77:20191117222312p:plain

CameraBoom変数をUSpringArmComponentクラスから、FollowCameraクラスをUCameraComponentクラスから作成しています。どちらもゲーム中にプレイヤーが動かすキャラクターに付随するカメラに関するクラスです。

これはUE4C++のThirdPersonのテンプレートならば全てのキャラクタークラスに最初から書かれている変数でした。ので次にいきます。

次はコンストラクターですね。

f:id:kazuhironagai77:20191117222446p:plain

これもUE4C++のThirdPersonのテンプレートです。

というかUE4C++のThirdPersonのテンプレートと比較したら、BeginPlay()関数とtick()関数以外はほとんど同じでした。

ひょっとするとBeginPlay()関数とtick()関数の違いもUE4のバージョンの違いだけかもしれませんね。

とは言え、今見返してみるとかなりの事が分かります。

まず、このクラスが担当している機能です。

  1. キャラクターに付随するカメラについて
  2. キャラクターの操作方法について

です。

残念ながらキャラクターの形状を決めるクラスであるUStaticMeshComponetのようなクラスから作成された変数は、このクラス内にはありませんでした。もっと前の親クラスでそれは決定されているようです。

念のために教科書でも確認してみます。

教科書では、ThirdPersonテンプレートは使用していないみたいですね。Characterクラスは最初から作成していますね。

解説を読むと結構詳しくUE4で提供されているThirdPersonのテンプレートとどこか違うのかの解説がされていました。

作成したキャラクタークラスをどうやってプレイヤーが操作するキャラクターに紐づけしているのかだけは絶対知りたかったのですが、それもこの教科書に書いてありました。

使用するゲームモード内に指定する個所がありました。

f:id:kazuhironagai77:20191117222624p:plain

どこかにこのキャラクターから派生したクラスでDefault Pawn Classに指定するためのブループリントの元になるクラスの作成方法を解説したチュートリアルはないのでしょうか?

2.公式ページのCharacterを読む。

ここにCharacterクラスの解説が載っていました。

この解説を読む限りにおいては、キャラクターの形を決定するSkeletal mesh componentクラスはCharacterクラスで定義されているようです。

f:id:kazuhironagai77:20191117222726p:plain

コードからも確認してみます。

f:id:kazuhironagai77:20191117222746p:plain

されていました。

と言う事は、こっちのモデル、

f:id:kazuhironagai77:20191117223151p:plain

つまり、沢山のSkeletal mesh componentを使用している場合はこのキャラクタークラスそのものに変更が必要なのかもしれませんね。

<Modular RPG Heroes Polyartに武器を装備する方法>

調査します。

f:id:kazuhironagai77:20191117223337p:plain

適当にいじっていたら出来ました。

以下にやり方を示します。

まず、UE4C++のcharacterクラスからブループリントクラスを派生させます。

f:id:kazuhironagai77:20191117223422p:plain

MeshにStatic Meshを追加します。Right weaponと名付けました。

f:id:kazuhironagai77:20191117223451p:plain

それぞれに対応するmeshを選択します。

f:id:kazuhironagai77:20191117223536p:plain

f:id:kazuhironagai77:20191117223544p:plain

Right weaponの場合は、Parent Socketの項目があるので、hand_rSocketを選択します。

f:id:kazuhironagai77:20191117223647p:plain

セーブします。後、武器の位置を微調整しました。

f:id:kazuhironagai77:20191117223730p:plain

勿論、ゲームモードの設定も変えました。

f:id:kazuhironagai77:20191117223754p:plain

そして

f:id:kazuhironagai77:20191117223843p:plain

こんな感じに出来ました。

<まとめと感想>

今週で、

f:id:kazuhironagai77:20191117223924p:plain

をインポートして2週目ですが、かなり使い方が分かって来ました。

f:id:kazuhironagai77:20191117223955p:plain

こっちのSkeletal meshが沢山ある方の使い方もだいたい想像が着きました。しかしそれは、来週以降にする事にします。

Characterクラスの派生クラスで何を指定しなければならないかと、どのように指定するのかも大体分かりました。これはかなりUE4自体を理解するためのかなり大きな前進になりました。昔ならかなり喜んだと思いますが、UE4をパズルに例えると、もう残りのピースを埋めるだけの作業なので、まあ満足と言ったところです。それにもうUE4の勉強を始めて2年経過してますしね。分かっても当然とならないと。

今週はこれでお終いです。