0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UE5 プレイヤーを操作してタイル間を移動

Last updated at Posted at 2025-01-21

概要

プレイヤーを操作してタイル間を移動してみる。

入力は Enhanced Input、移動は Move Component To ノードで行う。

cm40_3.gif

前回

今回の内容のプロジェクト一式

環境

UE 5.1.1

Enhanced Input

移動入力する為のアセットを作成する。

コンテンツブラウザで右クリック > 入力 > 入力アクション で IA_Move を追加。

2025-01-19_16h47_27.png

IA_Move

移動用の 入力アクション を追加

ここで定義するのは、このアクションに対してどんなパラメータが必要となるのか?
前後左右への移動は2Dの軸方向 (x, y) で表すことが出来るので、今回は Vector2D を指定する。

2025-01-19_18h21_18.png

ValueType : Axis2D (Vector 2D)

IMC_InGame

入力マッピングコンテキスト を追加

2025-01-19_16h48_05.png

とりあえずキーボードの WASD に移動入力を割り当ててみる。

公式ドキュメントから引用した表がこちら。多分これで良い?
image.png

ぱっと見よく分からないのが、入力モディファイアの部分。
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) を追加。

下記の通り

2025-01-21_14h43_52.png

BP_PlayerController

プレイヤーに対して入力マッピングコンテキストを適用する

フルブループリントエディタを開く を押してグラフを編集できるようにしておく。

GetEnhancedInputLocalPlayerSubsystem を追加

2025-01-20_01h21_26.png

ピンを伸ばして Add Mapping Context 追加

2025-01-20_01h22_22.png

BeginPlay と繋げる

2025-01-20_01h22_44.png

IMC_InGame を指定。

2025-01-20_01h28_11.png

おためしで IA_Move が呼ばれたら画面にログを出力してみる。
グラフに IA_Move を追加して Print String。

image.png

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

2025-01-21_13h19_20.png

インプット

  • TargetTile (BP_BoardTile)
  • Duration (float)

2025-01-21_13h27_20.png

ノード

2025-01-21_14h33_55.png

Move Component To は非同期で動作する、Latent という種別のノードとなる。
Latent ノードはイベントグラフでのみ利用可能で、関数内では利用不可。

2025-01-21_14h36_19.png

BP_PlayerController

IA_Move イベントが来た時の処理を実装する。

具体的には、

  • 入力値とプレイヤーのグリッド座標を足して、次のグリッド座標を求める
  • グリッド座標をキーにタイルのコンテナから移動先タイルを取得(無ければエラー表示)
  • 先ほど作ったカスタムイベントの MoveToTile を呼ぶ

多分もっと綺麗にまとめられるのだろうけど、ノードをあまり知らないのでとりあえず動けばヨシで。

2025-01-21_14h53_01.png

下記はノードをダブルクリックで追加できる Reroute ノード。整理用
2025-01-21_14h53_24.png

まだ同時入力出来てしまったり、プレイヤーの向きが移動方向に反映されていなかったりするが、一応これで WASD 入力によるタイル間の移動が可能になる。

2025-01-21_15h14_08.png

ちょっとだけ修正

… と言いたいところだが、前回までのコードだとグリッド座標の X, Y を UE の座標軸へそのまま配置してしまっているので X, Y が入れ替わり意図しない方向に動いてしまう。

なのでタイルの生成位置はグリッド座標と同じく X が横で Y が縦(奥) となるように生成時の座標計算のノードを変更する。

BP_GameBoard の CalcTileLocation 関数を修正。

2025-01-21_15h04_01.png

おわり

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?