<前文>
AIとかDeep learningまたはビックデータなどのデータサイエンスはコンピューターサイエンスの中でも最も流行っている分野ですね。でも私はあんまり信じていません。理由は簡単で、アメリカ人の性格から考えて、そんなに効果があるならば、他人に教える訳ないからです。そういう皮肉れた見方をしていると、やっぱり否定的な意見が目に留まる訳で、あるサイトに書かれていたのが、企業がデータ科学者(data scientists)を雇って、収益が上がったケースは15%しかない。と書かれていました。そのサイトによると、その主な理由は、
- 個人情報との関係で必要なデータが使用出来ない。
- データ科学者(data scientists)の出した予測は、他の部署では常識だった。(大企業だと部署毎に扱えるデータが違うため、このような事が起きる。)
とありました。まあ、必要なデータがそろわないから分析も出来ないわけですね。
これってどうなんでしょうね。日本だとまだ、罰則ないから違法でも構わないと、強引に必要なデータを集めて分析して、結果だけ内緒で社内で使用したりする会社もありそうです。
まあ、それはともかく、こんな風にデータサイエンスに対してネガティブに見ている私でも、データの可視化だけは興味があります。
例えば、紙のグラフはf(x)の関数の挙動しか描く事しかできませんが、パソコン内のグラフならば、3次元上に描けるので、見やすいかどうかはともかく、f(x,y)のグラフまで描けます。でも、科学的に重要な式って大体、f(x,y,z,t)みたいにもっと変数がありますよね。これらを一発で可視化出来る方法がないんでしょうか?
とか考えています。
そして、ひょっとするとUE4がそういうデータの可視化に対して凄い威力を発揮したりするではと、思ったりもしています。
それでは、今週の勉強を始めます。
<本文>
前回は、プレイヤー用のキャラクターを
から、選択する方法を解明しました。
今回は、
- 実際のプロジェクトにModular RPG Heroes Polyartを追加して、そのプレイヤーの3Dモデルを変更します。
- 実際のプロジェクトでは、FieldPlayerBPクラスを使用してプレイヤーが操作するキャラクターを作成していますが、これをどのように作成したのかを覚えていないので、その復習もおこないます。
- 最後に、Modular RPG Heroes Polyartに武器を装備する方法も調査します。
を行います。
<Modular RPG Heroes Polyartのキャラクターに変更する>
前回と全く同じ方法で行います。もっと効率が良い方法はありそうですが、失敗した時のリスクが許容範囲を超えてしまう可能性があるし、前回の復習にもなりますので今回は新しい方法を試す事はしません。
1.ModularBodyPartsをプロジェクトに追加する。
追加しました。
2.FieldPlayerBPのSkeletal Meshを変更する。
失敗した時のためにFieldPlayerのコピーを取っておきます。
Skeletal MeshをApprenticeSKに変えます。
テストします。
前回と同じようにプレイヤーのキャラクターがApprenticeSKに代わりました。
前回と同じ様に、モーションもテストします。
今回は、Combo03_DoubleSwordAnimを使用してみます。
スクリーンショットでは、滑らかな動きを見せられませんが綺麗に動きました。
3.SK_MannequinのスケルトンであるUE4_Mannequin_SkeletonとApprenticeSKのスケルトンであるUE4_Mannequin_Skeletonを関連づける。
ここら辺からちょっとやり方が曖昧な部分があります。丁寧に進めていきます。
ThirdPersonRunを開きます。ThirdPersonRunはApprenticeSKから使用したいモーションです。
エディターの右上にあるタブからSkeletonを選択します。
Retarget Manager内のSelect RigからHumanoidを選択します。
セーブします。
今度はApprenticeSKを開き、Skeletonを選択します。
ThirdPersonRunのSkeletonでやった事と同様にここでもSelect RigにHumanoidを選択します。
セーブします。
ThirdPersonRunを右クリックしてRegarget Anim Assetsを選択しDuplicate Anim Assets and Retargetを選択します。
すると、Select Skeletonエディターが開きます。Select Skeleton の項目にUE4_Mannequin_Skeletonを選択すると右のTarget画面にナイトのモデルが表示されます。
二つのモデルの上腕の位置が同じではないので、これを直します。一端Select Skeletonは閉じます。
ThirdPersonRunからskeletonにいって腕の位置を変更します。
Modify Poseを押します。
あれ、こんな画面、先週は表示されたんでしょうか?
UseCurrentPoseを取りあえず選択します。
もう一度、ThirdPersonRunからDuplicate Anim Assets and Retargetを選択します。
今度は両方のモデルが同じポーズを取っていますね。ちょっと安心です。
Retargetを押します。
以下に示すように、ApprenticeSKのためのThirdPersonRunが作成されました。
テストします。
いつものように、FieldPlayerのmeshのAnimation内のAnim to PlayにThirdPersonRunをセットします。
Playを押してゲームを実行します。
キャラクターが綺麗に走り始めました。ここまでは成功です。
4.ApprenticeSK のためのThirdPerson_AnimBPを作成する。
まずは、ThirdPerson_AminBPのためのフォルダーを作成します。FiledPlayerMotionsと名付けました。
残りの全部のAnimation SequenceもApprenticeSKのために変換します。
出来ました。
ThirdPerson_IdleRun_2Dを作成します。
前回と同じようにMyThirdPerson_IdleRun2Dと名付けました。
前回と全く同じ方法で軸の設定をしました。
グラフの左端にThirdPersonIdle、左から3分の1の所にThirdPersonWalk、そして右端にThirdPersonRunを配置します。
これで完成です。
ApprenticeSKのためのThirdPerson_AnimBPを作成します。
前回と同じ方法で作成しました。中身も作って行きます。
作り方は全く前回と同じなので結果だけ示していきます。
EventGraph内を作成していきます。
この部分も前回と全く同じです。
これで全部完成しました。
テストします。
FieldPlayerのmeshのAnimation内のAnim to PlayにMyThirdPerson_AnimBP_Cを選択します。
Playを押してゲームを開始します。
キーボードの操作に合わせて綺麗に動きますがジャンプはしません。
そもそもジャンプを作成していませんでした。
まあいいでしょう。一応これで完成です。
<FieldPlayerBPクラスの復習>
実際のプロジェクトでは、FieldPlayerBPクラスを使用してプレイヤーが操作するキャラクターを作成していますが、これをどのように作成したのかを覚えていないので、その復習をおこないます。
1.RPGCharacter.hを読む
取りあえず色々やる前に、FieldPlayerBPクラスの親クラスであるRPGCharacterクラスを読んでみます。
ヘッダーファイルから行きます。
まず、この二つの変数がいきなりぶっこまれています。何もモードを指定していなので多分デファルトでPrivateになっているのでしょう。クラスだし。それで「BlueprintReadOnlyとするとPrivateなのでブループリントからアクセスは出来ません。」とエラーになってコンパイル出来ないので、metaでAllowPrivateAccess = ”true”としているんですね。
そう言えば、このPrivateの変数にUPROPERTYでBlueprintReadOnlyを付けるとコンパイルエラーになる事と、それを避けるためにmeta = (AllowPrivateAccess = “true”)と書く事は、UE4C++で一番最初に教えるべき内容の一つだと思いますが、それを説明している教科書って見た事ないですね。
そもそもUE4C++で作成されたクラスは、ブループリントで派生して使用する予定なのになんで最初からprivateで書くのかが不明ですが、これこそ教科書で説明してほしいですね。
よし。自分で調べて見ます。
以下に示す変数を別の壊しても問題ないプロジェクト内のあるクラスで作成しました。
そのUE4C++からブループリントを作成します。
そのブループリントのイベントグラフを開き、変数testAllowPrivateAccessを呼び出してみます。
以下に示すように、ブループリントからアクセス出来ます。
次はこれで試してみます。
今度は呼び出せませんでした。
これは、まあ当然ですね。
次は、meta = (AllowPrivateAccess = "true")を抜いた場合です。確かコンパイルエラーになったはずです。
やっぱりエラーになりましたが、原因が書かれていません。
エラーの理由が不明です。
あっ、そうでした。UE4C++由来のエラーはUE4エディターからコンパイルしないと原因不明になってしまうんでした。
はい。しっかりエラーの原因も表示されました。
よし、こっから調査に入ります。
まずはprivateをprotectedに変更します。
勿論、ビルドは成功です。
今回は普通にアクセス出来ます。
うーん。こっちでいいと思うんですが。
ここまで書いて閃きました!
この変数を持つクラス、UEC++クラスの親クラスに成る可能性もあると思います。その時にその子クラスからアクセス出来ないようにしたい場合は、privateにするしかない訳です。
試してみました。
Protected の場合はtestAllowPrivateAccessの変数を持つクラスの子クラスからtestAllowPrivateAccessにアクセスしてもコンパイルエラーには成りません。しかしprivateに変更した途端、コンパイルエラーに成りました。
分かりました。
まとめます。
UE4C++である変数を作成する時に、どうしてもブループリントからその変数にアクセスする必要がある変数があります。その変数は、その変数を持つクラスから派生したクラスからもアクセスしてほしくない変数なのですが、どうしたらいいでしょうか?
その答えが
BlueprintReadOnly、meta = (AllowPrivateAccess = "true")
です。
UPROPERTYだけで、こんなに時間がかかってしまいました。
宣言したクラスも見ていきましょう。
CameraBoom変数をUSpringArmComponentクラスから、FollowCameraクラスをUCameraComponentクラスから作成しています。どちらもゲーム中にプレイヤーが動かすキャラクターに付随するカメラに関するクラスです。
これはUE4C++のThirdPersonのテンプレートならば全てのキャラクタークラスに最初から書かれている変数でした。ので次にいきます。
次はコンストラクターですね。
これもUE4C++のThirdPersonのテンプレートです。
というかUE4C++のThirdPersonのテンプレートと比較したら、BeginPlay()関数とtick()関数以外はほとんど同じでした。
ひょっとするとBeginPlay()関数とtick()関数の違いもUE4のバージョンの違いだけかもしれませんね。
とは言え、今見返してみるとかなりの事が分かります。
まず、このクラスが担当している機能です。
です。
残念ながらキャラクターの形状を決めるクラスであるUStaticMeshComponetのようなクラスから作成された変数は、このクラス内にはありませんでした。もっと前の親クラスでそれは決定されているようです。
念のために教科書でも確認してみます。
教科書では、ThirdPersonテンプレートは使用していないみたいですね。Characterクラスは最初から作成していますね。
解説を読むと結構詳しくUE4で提供されているThirdPersonのテンプレートとどこか違うのかの解説がされていました。
作成したキャラクタークラスをどうやってプレイヤーが操作するキャラクターに紐づけしているのかだけは絶対知りたかったのですが、それもこの教科書に書いてありました。
使用するゲームモード内に指定する個所がありました。
どこかにこのキャラクターから派生したクラスでDefault Pawn Classに指定するためのブループリントの元になるクラスの作成方法を解説したチュートリアルはないのでしょうか?
2.公式ページのCharacterを読む。
ここにCharacterクラスの解説が載っていました。
この解説を読む限りにおいては、キャラクターの形を決定するSkeletal mesh componentクラスはCharacterクラスで定義されているようです。
コードからも確認してみます。
されていました。
と言う事は、こっちのモデル、
つまり、沢山のSkeletal mesh componentを使用している場合はこのキャラクタークラスそのものに変更が必要なのかもしれませんね。
<Modular RPG Heroes Polyartに武器を装備する方法>
調査します。
適当にいじっていたら出来ました。
以下にやり方を示します。
まず、UE4C++のcharacterクラスからブループリントクラスを派生させます。
MeshにStatic Meshを追加します。Right weaponと名付けました。
それぞれに対応するmeshを選択します。
Right weaponの場合は、Parent Socketの項目があるので、hand_rSocketを選択します。
セーブします。後、武器の位置を微調整しました。
勿論、ゲームモードの設定も変えました。
そして
こんな感じに出来ました。
<まとめと感想>
今週で、
をインポートして2週目ですが、かなり使い方が分かって来ました。
こっちのSkeletal meshが沢山ある方の使い方もだいたい想像が着きました。しかしそれは、来週以降にする事にします。
Characterクラスの派生クラスで何を指定しなければならないかと、どのように指定するのかも大体分かりました。これはかなりUE4自体を理解するためのかなり大きな前進になりました。昔ならかなり喜んだと思いますが、UE4をパズルに例えると、もう残りのピースを埋めるだけの作業なので、まあ満足と言ったところです。それにもうUE4の勉強を始めて2年経過してますしね。分かっても当然とならないと。
今週はこれでお終いです。