概要
作業ログの続き。
簡単なターン制御を実装する。
- プレイヤーと敵が交互にタイル上を移動する
- 敵は1体だけで、ランダムなタイルに移動する
前回
今回の内容のプロジェクト一式
(ユニット同士の重なり防止も対応しているのでちょっと変えている)
環境
UE 5.5.1
列挙型 E_GamePhase 追加
コンテンツブラウザで列挙型 E_GamePhase を作成する。
項目は下記の2つ。
- PlayerTurn
- EnemyTurn
BP_PlayerController
敵のターンで入力操作されないように、単純にフラグで制御しておく。
このフラグはターン制御時に切り替える。
GM_TestGame (GameMode)
初期化
BeginPlay で Player と Enemy をスポーンさせているので、それぞれ参照を格納しておく。
最後に GamePhase を初期値 PlayerTurn に設定し、後述の ChangeTurn 関数を呼びだす。
EndTurn 関数
ターン終了時の GamePhase 切り替え処理と、新しいターンの処理を行う。
※ PlayerUnit と EnemyUnit 変数は BP_TestGame でのスポーン時にセットしておく。
ChangeTurn 関数
現在指定されているターンの処理を実装する。
(関数名がちょっと悪いかもしれない)
具体的にはプレイヤーなら入力操作 OK にして移動するまで待機、敵なら入力操作 OFF にしてランダムなタイルへ自動で移動させる。
前半
後半
敵のランダム移動処理。
赤枠の GetAdjucentTiles は BP_GameBoard に次で実装する。
敵の前後左右タイル配列からランダムに1つ選び、プレイヤーの移動と同じく MoveToTile を呼ぶという流れ。
GetAdjucentTiles は BP_GameBoard の処理なので次で実装する。
BP_GameBoard
敵の移動先タイルを配列に格納する関数を BP_GameBoard に実装する。
GetAdjucentTiles 関数
単純に現在グリッド座標に前後左右4パターンのオフセットを足した座標のタイルを取得し、それぞれ ResultTiles に格納している。ランダムな隣接タイル候補。
これを4回しているだけ。
Add Tile to Result TIles 関数
指定タイルのオフセット位置にあるタイルを配列に格納するが、タイルが無い座標は無視するようにしている。
関数名含めやっつけ感があるが、GetAdjucentTiles 内で使用する共通処理をまとめただけ。こういうのってマクロでも良いのかもしれない。
移動終了時にターン終了を呼ぶ
BP_PlayerUnit と BP_EnemyUnit のベースクラスである BP_Unit の MoveToTile 関数 (単純なタイル間移動) の最後で、BP_TestGame の TurnEnd 関数を呼んで完了。
おわり