Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4.5 KiB
4.5 KiB
Tactica 作業メモ
最終更新: 2026-11-01
完了した作業
| コミット | 内容 |
|---|---|
46e5509 |
マス選択の基本: GameMode / PlayerController / 固定カメラ、ホバーのハイライト、クリックで座標をログ出力 |
3a80827 |
マスの選択状態、カメラのグリッド中心への自動配置、FGridMath(座標計算) |
b18c19a |
ユニットの配置、移動範囲の表示、移動の実行 |
現在の構成
論理層(UObject非依存) → データ層 → Actor層 の順に依存する。
- 論理層
FGridMath: セル座標とワールド座標の変換、範囲判定、グリッド中心FGridState: 1マスごとの歩行可否・高さ・占有ユニットIDFGridPathfinder: ダイクストラで到達可能マスを求め、経路を復元する(4方向、コストはGetStepCostで差し替え可)
- データ層
FUnitStats: 移動力など。FTableRowBase継承で、将来DataTableに移せる
- Actor層
AGridCell: マスの見た目。色の優先順位は 選択 > ホバー > 移動可能 > 通常AGridManager: マス生成、FGridStateの所有、ユニット生成、占有情報の唯一の更新者AUnit: シリンダーの見た目。Tickは移動中だけ有効ATacticaCameraPawn: グリッド中心を見る固定俯瞰カメラ(位置を自動計算)ATacticaPlayerController: 入力と状態(Idle/UnitSelected/Moving)ATacticaGameMode:DefaultEngine.iniのGlobalDefaultGameModeで指定
設計上の決定事項
- マスの判定:
WorldDynamicのオブジェクトタイプに限定したレイ。地形(Landscape)がマスの上面と同じ高さにあり、Visibilityチャンネルだと判定が交互に切り替わったため。 - ハイライト:
/Engine/BasicShapes/BasicShapeMaterialの動的マテリアルでColorパラメータを変更する。新規アセットなし。 - 入力:
InputComponent->BindKey。左クリックだけなので最小。操作が増えたら、C++でInputActionを実行時生成する方式への移行を検討する。 - 占有情報: 移動の開始時に確定させる。見た目は後から追いかける。
- ユニットの当たり判定:
NoCollision。マスのクリック判定を邪魔しないため。クリック先のユニットは占有情報から引く。 - 歩行可否: マス生成時に
AGridCell::bIsWalkableをFGridStateへコピーし、以後はFGridStateを正とする。
未確認・既知の注意点
- ユニット機能(
b18c19a)は、ビルドは通っているが、エディタでの動作確認は未実施。 - カメラ距離は長辺基準の近似。画面比によっては端が切れる可能性がある。
- 地形とマスの上面が同じ高さ(Z=0)なので、見た目のz-fightingが出る場合は
GridManagerのZを少し上げる。 bIsWalkableを実行中にエディタで変えても、FGridStateに反映されない。- ユニットIDは生成順の連番。セーブ/ロードやDataTable連携を入れる際に見直す。
CLAUDE.mdの「現状」節は古い(次の目標が「マウスでマスを選択」のまま)。更新が必要。- リポジトリには、今回の作業と無関係な
Content/の差分が大量に残っている。コミットには含めていない。
残りのタスク
直近
- ユニット機能のエディタ動作確認(選択、範囲表示、移動、移動中の入力無視、範囲外クリック)
CLAUDE.mdの「現状」を更新Content/の未コミット差分の扱いを決める(コミットするか、破棄するか)
次の機能(ユーザーの要件にあるが未着手)
- ターン制(プレイヤーターン / 敵ターンの切り替え)
- 行動ポイント(1ターン2アクション。移動・攻撃で消費)
- 敵ユニットの配置とAI
将来の拡張(設計では対応可能な構造にしてある)
- ユニットステータスのDataTable化(
FUnitStatsを行構造体として利用) - 高低差と移動コスト(
FGridCellData::Height、GetStepCostの拡張) - 遮蔽・命中率・視線判定(
FGridStateを読む純粋ロジックとして実装) - 攻撃とダメージ
- 味方ユニットを通り抜ける移動(現状は全ユニットが障害物)
- Enhanced Inputへの移行(操作が増えた場合)