概要
プレイヤーを操作してタイル間を移動してみる。
入力は Enhanced Input、移動は Move Component To ノードで行う。
前回
今回の内容のプロジェクト一式
環境
UE 5.1.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)
ノード
Move Component To は非同期で動作する、Latent という種別のノードとなる。
Latent ノードはイベントグラフでのみ利用可能で、関数内では利用不可。
BP_PlayerController
IA_Move イベントが来た時の処理を実装する。
具体的には、
- 入力値とプレイヤーのグリッド座標を足して、次のグリッド座標を求める
- グリッド座標をキーにタイルのコンテナから移動先タイルを取得(無ければエラー表示)
- 先ほど作ったカスタムイベントの MoveToTile を呼ぶ
多分もっと綺麗にまとめられるのだろうけど、ノードをあまり知らないのでとりあえず動けばヨシで。
下記はノードをダブルクリックで追加できる Reroute ノード。整理用
まだ同時入力出来てしまったり、プレイヤーの向きが移動方向に反映されていなかったりするが、一応これで WASD 入力によるタイル間の移動が可能になる。
…
ちょっとだけ修正
… と言いたいところだが、前回までのコードだとグリッド座標の X, Y を UE の座標軸へそのまま配置してしまっているので X, Y が入れ替わり意図しない方向に動いてしまう。
なのでタイルの生成位置はグリッド座標と同じく X が横で Y が縦(奥) となるように生成時の座標計算のノードを変更する。
BP_GameBoard の CalcTileLocation 関数を修正。
おわり