どんなゲームエンジンもミニマムなサンプルプロジェクトを解析するのが一番。というわけで、いまさらな感じもしますがFirstPersonプロジェクトを解析してみます。
UE4において、基本的に処理の流れを確認するには、
- プロジェクト設定を確認する。
- レベルブループリント(LevelBP)を確認する。
- レベルに配置されたアクターを確認する。
この3ステップを踏めばOKのはずです。BPだろうとC++だろうと、基本は頭から追っていけば何も怖くありません(キリッ)。では、プロジェクト設定を見ていきましょう。プロジェクト設定の「マップ&モード」のDefault Modesを見てみると、FirstPerson用のクラスが割り当てられているのがわかります。
おそらくこのプロジェクトのメインとなるBPがFirstPersonGameModeです。
それに紐付ける形でPawnやHUDのクラスが割り当てられています。PlayerControllerやGameStateは初期設定のままなので、FirstPerson向けには何もカスタマイズされていないことになります。
次に、レベルブループリントを確認してみましょう。
何もありませんね。ということはレベルブループリントでは何もしていないことになります。
最後にアウトライナーに配置されたアクターを確認してみます。
「ArenaGeometry」は配置物ですね、地面や積み上げられたブロックが配置されています。「Lighting」は光源。「RenderFX」はポストエフェクトなどのために配置されています。FirstPerson用には「FirstPersonCharacter」が配置されています。これでプレイヤーの開始位置を決定している様です。
ここまでで、まだBPのノードを追ったりはしていませんが、UE4における超ざっくりとした処理の流れがわかります。「このFirstPersonプロジェクトは、レベルBPでは何も処理していなくて、肝となるのはFirstPersonGameMode。こいつがこのプロジェクト/レベルにおけるMain関数の様なもの。それでFirstPersonCharacter でキャラを生成しているのかな?」ってな感じで・・・。
BPの解析
解析なんてたいそうな見出しにしてしまいましたが、割り当てられたBPを追っていくだけです。ですがこれがとても大事でどんなプログラムもこれを怠ると後々痛い目を見みます。コンテンツブラウザのBlueprintsにあるFirstPersonGameModeを開きます。先の確認でMainであると解釈したのでここから処理を追っていきましょう。
ここも何もないですね。ConstructionScriptを覗いてみても特に何もありません。ということはキャラはFirstPersonCharacter 、HUDの表示はFirstPersonHUDでゴニョゴニョしていることになります。
プレイヤーキャラの挙動
FirstPersonCharacter BPクラスを開いてBPのノードを確認していきます。
親切にコメントが記述されているのでそれを元に理解を深めていきます。コメントって本当に大事です。何もない状態から手探りで解析するのとは雲泥の差があります。それに半年後の自分は他人ですし。ではでは上から順に処理の内容を確認してみます。
- 「Stick input」ゲームパッドのアナログスティック入力によってプレイヤーの視点を更新します。
- 「Mouse input」マウスのX,Y座標を元にプレイヤーの視点を更新します。
- 「Movement input」プレイヤーの移動処理。
- 「Jump」ジャンプできます。
- 「Spawn Projectile」弾を発射します。
これらがFirstPersonCharacter クラスの持つ機能になっています。
ジャンプ処理なんですが、Jumpキーが押されたときに、CharactorコンポーネントのJumpノードに任せてジャンプして、離したときにStopJumpingでジャンプをキャンセルしています。ジャンプ力などのパラメータはCharacterMovementコンポーネントの詳細から設定できます。
試しにJump Z Velocityの値を大きくするとより大きくジャンプします。いろいろ触ってみるとわかることが増えるので恐れず触りまくります。
InputAction Fireキーが押されたときに、GetAnimInstanceノードでアニメーションのインスタンスを取得しています。TargetにはMesh2Pが設定されています。このMesh2Pって何?となるとは思いますが、コンポーネントの一覧を確認するとFirstPersonCameraコンポーネントの子にぶら下がっているのが確認できます。
さらに、ダブルクリックで中身を確認するとスケルタルメッシュが設定されています。
「あぁ、Mesh2Pという名前のスケルタルメッシュコンポーネントのアニメーションインスタンスを取得しているんだなぁ」と分かります。スケルタルメッシュというのはスキンメッシュとか言われている物です。単純に骨があるアニメーションするメッシュと覚えておけば良いと思います。
この取得したアニメーションインスタンスを使って「Montage Play」ノードを読んでいます。ここで弾の発射時の反動アニメーションを再生しています。その後はSpawnActorで弾を生成してPlaySoundで発射音を再生しています。弾の発射位置はプレイヤーの姿勢からのGunOffsetで決まります。
弾の衝突時の処理はFirePersonProjectile BPクラスで実装されています。ここで跳ね返ったりさせていきます。EventHitノードは何かに衝突した時に呼ばれ、Is Simulating Physicsであたったメッシュの物理が有効か確認した後、有効であれば「Add Impulse At location」でメッシュに力を加え移動させています。最後に弾を消して終了です。
EventRecirve Draw HUDはHUDの描画時、毎フレーム呼ばれます。SizeXとSizeYにはスクリーンサイズが入っているので÷2して画面の中心にDraw Textureでテクスチャを描画して終わりです。これはとってもシンプルなので分かりやすいかと思います。
Stick input 処理
赤いノードに注目します。これらは処理の開始点です。InputAxis TurnRoteはTourRoteの入力があったときに呼ばれますが、このTourRoteはサンプルプロジェクト専用に定義されているもので、どんな入力があったときに呼ばれるものなのかは「プロジェクト設定」→「インプット」に定義されています。
TurnRateはゲームパッドの右スティックX軸やキーボードの左右の矢印キーを入力した時にScaleで設定された値を引数としてInputAxis TurnRote処理が呼ばれるということがわかります。この様に複数のキーをひとつのキーに割り当てたりするものを仮想キーと呼んでいます。(多分・・・)。決定ボタンとかそうですよね。そのゲーム上でどの番号のボタンが決定ボタンなのかは開発が決めるのでその取り決めをここで行っています。キーコンフィグなんてものがありますが、それでもゲーム起動時のデフォルトは開発が決めたものになっています。
では、InputAxis TurnRote処理を見ていきましょう。InputAxis TurnRoteノードの先にはAdd Controller Yaw Inputに繋がっていて、Val(値)がセットされています。Add Controller Yaw Input はCharactorMovement コンポーネントのRotationRate のYaw要素 に入力に応じた値を加算して、視点を更新しています。簡単に言えば、プレイヤーの視点を横回転させているだけです。そしてもう一方のInputAxis LookUpRateは プレイヤーの視点を縦に回転させているだけとなります。
Mouse input 処理
こちらもやっていることはStick inputと変わりなく、マウスのX軸,Y軸からYaw/Pitchを加算してプレイヤーの視点を更新しています。
Movement input 処理
AddMovement inputでプレイヤーを移動させています。MoveForwardで前後に、MoveRightで左右に移動します。本当に思った通りの処理なのか確認するためには、一度繋がっているノードを解除して実行してみるとハッキリわかります。
Movement input 処理
試しにJump Z Velocityの値を大きくするとより大きくジャンプします。いろいろ触ってみるとわかることが増えるので恐れず触りまくります。
Spawn projectile 処理
さらに、ダブルクリックで中身を確認するとスケルタルメッシュが設定されています。
「あぁ、Mesh2Pという名前のスケルタルメッシュコンポーネントのアニメーションインスタンスを取得しているんだなぁ」と分かります。スケルタルメッシュというのはスキンメッシュとか言われている物です。単純に骨があるアニメーションするメッシュと覚えておけば良いと思います。
この取得したアニメーションインスタンスを使って「Montage Play」ノードを読んでいます。ここで弾の発射時の反動アニメーションを再生しています。その後はSpawnActorで弾を生成してPlaySoundで発射音を再生しています。弾の発射位置はプレイヤーの姿勢からのGunOffsetで決まります。
弾の衝突時の処理
弾の衝突時の処理はFirePersonProjectile BPクラスで実装されています。ここで跳ね返ったりさせていきます。EventHitノードは何かに衝突した時に呼ばれ、Is Simulating Physicsであたったメッシュの物理が有効か確認した後、有効であれば「Add Impulse At location」でメッシュに力を加え移動させています。最後に弾を消して終了です。
照準の表示
EventRecirve Draw HUDはHUDの描画時、毎フレーム呼ばれます。SizeXとSizeYにはスクリーンサイズが入っているので÷2して画面の中心にDraw Textureでテクスチャを描画して終わりです。これはとってもシンプルなので分かりやすいかと思います。
最後に
ここまでお読み頂きありがとうございます。今更感は否めないのですが、ちょっとまじめにサンプルプロジェクトを解析してみましたがいかがだったでしょうか?これからUE4始めるよって方に少しでも役に立てれれば幸いです。これからも、ちょこちょこ更新していきますので当ブログをよろしくお願い致します。(ペコリ)
0 件のコメント:
コメントを投稿