使用ソフトウェア | バージョン | 備考 |
---|---|---|
Unreal Engine | 5.0.1 |
今回はキャラクターを前後左右に動かすだけの実装がどうなっているのかを見る。
サムネ詐欺になるが、アニメーションは実装しないので直立したまま移動する。
使用させていただいているモデルはUE公式で無料のParagon Aurora
Paragon: Aurora:Epic コンテンツ - UE マーケットプレイス
一部過去の記事の理解が必要なのでそこはリンクを入れてある。
ただちょっと複雑なので理解に時間がかかるかもしれない。
自前のキャラクターブループリントを開いてノードを組んでいく。
移動だけなら非常にシンプルなノード構成になっており、以下がすべて。
キャラクターブループリントを作成したらイベントノードに上のまま貼り付ければ動く。
上のインプット~
になっているノード2種は、コントローラーの入力を拾うイベント。
編集 > プロジェクト設定 > インプット
に設定されているキーに反応しているだけなので、自由にキー名やイベント名を変えられる。
このキー入力を受けるイベントはTick
ノードのように基本毎フレーム実行されている。
Tick
と違って不要になるとシステム側で自動で止まるので賢いノードだが、この先に無駄な処理をつなぐとものすごい勢いで処理コストを消費する可能性があるので注意する。
実際にキャラクターを動かしているノードはこれ。
キャラやアクタを移動するノードは色々あるがコントローラからの入力でキャラを動かすときはAdd Movement Inputで良い。
World Direction
で移動する方向を決定Scale Value
の強さでその方向に移動する ※この値(-1.0 ~ 1.0) × 設定されているスピード値で決定この場合ターゲットは自分自身なので何も繋がなくてOK。
Get Forward Vector
はX, Y, Z
に入力された角度から求められる単位ベクトルを出力する。
単位ベクトルって何!?となるかもしれないが難しく考える必要はない。
シンプルに角度を入力すると矢印を作って出力する(角度を方向へ変換)というイメージ。
後ろへ下がるボタンを押すとScale Value
がマイナスになるのでベクトルは後ろ向きになる。
単位ベクトルというのはこの矢印の長さが1
というだけ。
長さが1
なのもここではあまり気にする必要は無く「このベクトルが示すのは方向だけですよ。スピードや強さの意味はもってませんよ」みたいな感覚で十分。
実際に問題になってくるのはこれらを演算するときに重要となる。
よく見ると左右キー側のノードはGet Right Vector
となっている。
これは単純に入力された角度に対して右向きのベクトルを返すだけで上のノードと対して変わ らない。
つまりカメラが向いている方向を入れると、その横方向のベクトルが出てくる = 横移動。
Get ~ Vector
の前にはこのノードが入っている。
少しココが難しいのでじっくり。
前後移動キーのときはZ
の値を取っており
左右移動キーのときはX
とZ
を取っている。
ではこのX, Y, Z
は何をとってきているのだろうか。
順を追って解説していく。
カメラを作った回で解説したが、このBPではマウスの移動をそのままローテーションとして入力している
まずはこれによりマウスの動きがコントローラーのローテーションとして一旦保存される。
次にSpringArmコンポーネント
(カメラが乗っている自撮り棒みたいなもの)の詳細設定にて
Use Pawn Control Rotation
がオンになっている。
これをオンにすると
「マウスの入力がコントローラーのローテーションとして保存されて、その値がそのままカメラの方向になる」
したがって現在カメラが向いている方向 = コントローラーのローテーション(X, Y, Z)になっているわけだ。
Get Control Rotation
は実質カメラの方向が入っていると解説した。
では、コントローラのZ軸だけの回転を取得するということは何を意味するのだろうか。
これはZ軸(地面に対してまっすぐ立てた棒)にシャフトを置いたタイヤだと思えば良い。
今回のような歩行するキャラクターはこの回転の方向にだけ移動することができる。
ということはZ軸方向のカメラの角度だけあれば良い。
Z軸方向だけあれば良いと書いたが、左右移動のノードはX(Roll)の軸も使っている。
X軸のRoll回転とは次のような回転を指す。
この軸を利用するのは飛行機のような空中コントローラーとなることが多いのではないだろうか。
このキャラクターは地上の歩行モードであり、Roll回転入力の方法が実装されていない。
したがって実はこのピンを外してしまっても実際のキャラクターの動きはまったく変わらない。
上の記事を読んだあとでもう一度Add Movement Input
にはどんな「方向」が入力されるかをまとめる。
Get Control Rotation
で「カメラが向いている方向」を取得する(厳密にはカメラとは限らないが)Get Forward(Right) Vector
を使ってカメラ方向と移動キー方向を合成してベクトルを出力Add Movement Input
のWorld Direction
に移動する方向を入力して移動開始サンプルでもうすこし理解してもらえたら幸いだ。
次の例では「ずっと前進(W)キーを押し続けたまま、カメラ角度だけを変化」させている。
カメラの方向と移動キーの方向が合成されてキャラの移動が決定するのは上で述べた。
前進キーだけ押した状態でもカメラ角度が変化すれば移動する方向も変化するというのがこの実装だ。
今回の移動はベクトルが絡むので難しいかもしれない。
ただ、正直ここまで細かく考えなくても直感的に繋いでテストするのが早い気もする。
4回のシリーズでUEデフォルトのThirdParsonCharacter
のイベントグラフはほぼコンプリートといって良いかと思う(解説していない箇所は別の入力を処理しているだけ)
この先はアニメーション実装やゲームごとの実装で分かれると思うのでまた機会があれば記事を増やそうと思う。