2022-05-12

【キャラを作ろう#4】移動の実装【UE5】

キャラクターBPの移動がどう実装されているかを知る。

Article Image
使用ソフトウェアバージョン備考
Unreal Engine5.0.1

移動の実装

今回はキャラクターを前後左右に動かすだけの実装がどうなっているのかを見る。

サムネ詐欺になるが、アニメーションは実装しないので直立したまま移動する。

使用させていただいているモデルはUE公式で無料のParagon Aurora

Paragon: Aurora:Epic コンテンツ - UE マーケットプレイス

読者レベル

  • ブループリントとコンポーネントの概念がわかっていればOK
  • このシリーズのバックナンバーは可能な限り読まなくて良いように執筆

一部過去の記事の理解が必要なのでそこはリンクを入れてある。

ただちょっと複雑なので理解に時間がかかるかもしれない。

ノード全体

自前のキャラクターブループリントを開いてノードを組んでいく。

移動だけなら非常にシンプルなノード構成になっており、以下がすべて。

移動ノード

キャラクターブループリントを作成したらイベントノードに上のまま貼り付ければ動く。

インプットノード

インプット

上のインプット~になっているノード2種は、コントローラーの入力を拾うイベント。

編集 > プロジェクト設定 > インプットに設定されているキーに反応しているだけなので、自由にキー名やイベント名を変えられる。

キー設定画面

Tickのような役割がある

このキー入力を受けるイベントはTickノードのように基本毎フレーム実行されている。

Tickと違って不要になるとシステム側で自動で止まるので賢いノードだが、この先に無駄な処理をつなぐとものすごい勢いで処理コストを消費する可能性があるので注意する。

Add Movement Input

Add Movement Inputノード

実際にキャラクターを動かしているノードはこれ。

キャラやアクタを移動するノードは色々あるがコントローラからの入力でキャラを動かすときはAdd Movement Inputで良い。

このノードの入力

  • World Directionで移動する方向を決定
  • Scale Valueの強さでその方向に移動する ※この値(-1.0 ~ 1.0) × 設定されているスピード値で決定

この場合ターゲットは自分自身なので何も繋がなくてOK。

スピードの数値はCharacter MovementコンポーネントのMax Walk Speedで設定

Get Forward Vector

Get Forward VectorX, Y, Zに入力された角度から求められる単位ベクトルを出力する。

Get Forward Vector

単位ベクトルって何!?となるかもしれないが難しく考える必要はない。

シンプルに角度を入力すると矢印を作って出力する(角度を方向へ変換)というイメージ。

後ろへ下がるボタンを押すとScale Valueがマイナスになるのでベクトルは後ろ向きになる。

単位ベクトルというのはこの矢印の長さが1というだけ。

長さが1なのもここではあまり気にする必要は無く「このベクトルが示すのは方向だけですよ。スピードや強さの意味はもってませんよ」みたいな感覚で十分。

実際に問題になってくるのはこれらを演算するときに重要となる。

Get Right Vector

よく見ると左右キー側のノードはGet Right Vectorとなっている。

Get Right Vector

これは単純に入力された角度に対して右向きのベクトルを返すだけで上のノードと対して変わ らない。

つまりカメラが向いている方向を入れると、その横方向のベクトルが出てくる = 横移動。

Get Control Rotation

Get ~ Vectorの前にはこのノードが入っている。

少しココが難しいのでじっくり。

前後移動キーのときはZの値を取っており

前後移動のRotation

左右移動キーのときはXZを取っている。

左右移動のRotation

コントロールローテーションってなんだ?

ではこのX, Y, Zは何をとってきているのだろうか。

順を追って解説していく。

マウスの動きを取る

カメラを作った回で解説したが、このBPではマウスの移動をそのままローテーションとして入力している

カメラ用ノード

まずはこれによりマウスの動きがコントローラーのローテーションとして一旦保存される。

カメラの角度に設定

次にSpringArmコンポーネント(カメラが乗っている自撮り棒みたいなもの)の詳細設定にて

picture 5

Use Pawn Control Rotationがオンになっている。

これをオンにすると

「マウスの入力がコントローラーのローテーションとして保存されて、その値がそのままカメラの方向になる」

つまり、カメラの方向

したがって現在カメラが向いている方向 = コントローラーのローテーション(X, Y, Z)になっているわけだ。

  • 今回はカメラの方向がコントローラーのローテーションになっているが、必ずしもカメラの方向である必要はない。実装に応じて変わる。
  • X, Y, Zは内部で0~360の度数表記で扱われている。

Z軸(Yaw)を使うのはなぜ?

Get Control Rotationは実質カメラの方向が入っていると解説した。

Z軸

では、コントローラのZ軸だけの回転を取得するということは何を意味するのだろうか。

これはZ軸(地面に対してまっすぐ立てた棒)にシャフトを置いたタイヤだと思えば良い。

Z軸に回るタイヤ

今回のような歩行するキャラクターはこの回転の方向にだけ移動することができる。

ということはZ軸方向のカメラの角度だけあれば良い。

左右移動はX軸(Roll)も使っているけど?

Z軸方向だけあれば良いと書いたが、左右移動のノードはX(Roll)の軸も使っている。

左右の移動ボタンノード

X軸のRoll回転とは次のような回転を指す。

この軸を利用するのは飛行機のような空中コントローラーとなることが多いのではないだろうか。

このキャラクターは地上の歩行モードであり、Roll回転入力の方法が実装されていない。

したがって実はこのピンを外してしまっても実際のキャラクターの動きはまったく変わらない。

  • 移動モードはSet Movement Modeで設定するが詳しく解説しない。
  • 使用されていないY軸(Pich)は首を上下に動かすような動きである。
  • このタイプのゲームでは移動キーで上下(空中or地中へ移動)することはないためY軸は使用していないが、飛行モードでは使用する可能性がある。
  • 原理的にGet Forward VectorにはいかなるX値をいれてもベクトルは変わらない。Get Right Vectorが一応X値を取得しているのは、この値でRightのベクトルが変化するからか?

まとめて考える

上の記事を読んだあとでもう一度Add Movement Inputにはどんな「方向」が入力されるかをまとめる。

  1. Get Control Rotationで「カメラが向いている方向」を取得する(厳密にはカメラとは限らないが)
  2. キー入力が「前後」or「左右」で処理が変化
  3. Get Forward(Right) Vectorを使ってカメラ方向と移動キー方向を合成してベクトルを出力
  4. Add Movement InputWorld Directionに移動する方向を入力して移動開始

ちょっとよくわからない人のために

サンプルでもうすこし理解してもらえたら幸いだ。

次の例では「ずっと前進(W)キーを押し続けたまま、カメラ角度だけを変化」させている。

カメラの方向と移動キーの方向が合成されてキャラの移動が決定するのは上で述べた。

前進キーだけ押した状態でもカメラ角度が変化すれば移動する方向も変化するというのがこの実装だ。

以上

今回の移動はベクトルが絡むので難しいかもしれない。

ただ、正直ここまで細かく考えなくても直感的に繋いでテストするのが早い気もする。

キャラクターBPのイベントグラフに関しては完了

4回のシリーズでUEデフォルトのThirdParsonCharacterのイベントグラフはほぼコンプリートといって良いかと思う(解説していない箇所は別の入力を処理しているだけ)

この先はアニメーション実装やゲームごとの実装で分かれると思うのでまた機会があれば記事を増やそうと思う。



この記事をシェア


謎の技術研究部 (謎技研)