概要
追記: 色々バグってたので修正済。同時押し等の問題も解決
プレイヤーを操作してタイル間を移動してみる。
入力は Enhanced Input、移動は Move Component To ノードで行う。
前回
今回の内容のプロジェクト一式
環境
UE 5.5.1
Enhanced Input
移動入力する為のアセットを作成する。
コンテンツブラウザで右クリック > 入力 > 入力アクション で IA_Move を追加。
IA_Move
移動用の 入力アクション を追加
ここで定義するのは、このアクションに対してどんなパラメータが必要となるのか?
前後左右への移動は2Dの軸方向 (x, y) で表すことが出来るので、今回は Vector2D を指定する。
ValueType : Axis2D (Vector 2D)
IMC_InGame
入力マッピングコンテキスト を追加
とりあえずキーボードの WASD に移動入力を割り当ててみる。
公式ドキュメントから引用した表がこちら。多分これで良い?
ぱっと見よく分からないのが、入力モディファイアの部分。
Swizzle ってなんや… と思って ChatGPT に聞いてみたら以下のような意味らしい。
「Swizzle」は、プログラミングやコンピュータグラフィックスの分野で、データの並び順を変更する操作を指します。特に、ベクトルや軸の順序を再配置することを意味します。
IA_Move に対して W / A / S / D の4種を設定する。
-
各キー入力は 0(押していない)または 1(押している)の値のみ を返す
-
各キー入力は、まず 単純な X 軸の値(0 または 1)として解釈 される
-
各キーの目的に応じて、入力値を入力モディファイアで加工する
- W キーは正の Y 方向なので X と Y を入れ替える (Swizzle)
- A キーは負の X 方向なので負の値に変換する (Negate)
- S キーは負の Y 方向なので X と Y を入れ替え、負の値に変換する (Negate Swizzle)
- D キーは正の X 方向なので加工しない
そしてキーは1回押すごとに実行としたいので Triggers に 押される (Pressed) を追加。
下記の通り
BP_PlayerController
プレイヤーに対して入力マッピングコンテキストを適用する
※ フルブループリントエディタを開く を押してグラフを編集できるようにしておく。
GetEnhancedInputLocalPlayerSubsystem を追加
ピンを伸ばして Add Mapping Context 追加
BeginPlay と繋げる
IMC_InGame を指定。
おためしで IA_Move が呼ばれたら画面にログを出力してみる。
グラフに IA_Move を追加して Print String。
WASD の各ログ結果
LogBlueprintUserMessages: [BP_PlayerController_C_0] X=0.000 Y=1.000
LogBlueprintUserMessages: [BP_PlayerController_C_0] X=-1.000 Y=-0.000
LogBlueprintUserMessages: [BP_PlayerController_C_0] X=-0.000 Y=-1.000
LogBlueprintUserMessages: [BP_PlayerController_C_0] X=1.000 Y=0.000
BP_Player
プレイヤーの移動は一番簡単そうな Move Component To ノードを使う。
カスタムイベント MoveToTile を追加
プレイヤーのタイル間移動処理を作成する。
イベントグラフで右クリックしてカスタムイベントを追加する。
名前は MoveToTile
インプット
- TargetTile (BP_BoardTile)
- Duration (float)
変数追加
bMoving (boolean)
ノード
Move Component To は非同期で動作する、Latent という種別のノードとなる。
Latent ノードはイベントグラフでのみ利用可能で、関数内では利用不可。
BP_PlayerController
IA_Move イベントが来た時の処理を実装する。
具体的には、
- 入力値とプレイヤーのグリッド座標を足して、次のグリッド座標を求める
- グリッド座標をキーにタイルのコンテナから移動先タイルを取得(無ければエラー表示)
- 先ほど作ったカスタムイベントの MoveToTile を呼ぶ
多分もっと綺麗にまとめられるのだろうけど、ノードをあまり知らないのでとりあえず動けばヨシで。
下記はノードをダブルクリックで追加できる Reroute ノード。整理用
一応これで WASD 入力によるタイル間の移動が可能になる。
…が、このままではまだ色々問題があるのでそれぞれ対応する。
残りの問題を修正
移動方向が X, Y で逆
※ 前回のプロジェクトから進めた場合のみの問題
前回までに作成したコードではグリッド座標の X, Y を UE の座標軸へそのまま配置してしまっているのでタイルの X, Y が入れ替わり意図しない方向に動いてしまう。
なのでタイルの生成位置はグリッド座標と同じく X が横で Y が縦(奥) となるように生成時の座標計算のノードを変更する。
BP_GameBoard の CalcTileLocation 関数を修正。
移動時に進行方向へ向かせたい
アニメーションではなく瞬時に進行方向へ回転させる。
関数追加
BP_Player に RoateteToTile 関数を作成する。
インプット
TargetTile (BP_BoardTile)
アウトプット
NewRoatation (Vector)
イベントグラフを修正
スプリングアームの設定変更
カメラが回転に追従しないよう、SpringArm の下記チェックを全て外す。
同時押しによる斜め移動を防止
BP_PlayerController の IA_Move の最初に判定する
おわり