diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000..20685bb --- /dev/null +++ b/NOTES.md @@ -0,0 +1,68 @@ +# Tactica 作業メモ + +最終更新: 2026-11-01 + +## 完了した作業 + +| コミット | 内容 | +|---|---| +| `46e5509` | マス選択の基本: GameMode / PlayerController / 固定カメラ、ホバーのハイライト、クリックで座標をログ出力 | +| `3a80827` | マスの選択状態、カメラのグリッド中心への自動配置、`FGridMath`(座標計算) | +| `b18c19a` | ユニットの配置、移動範囲の表示、移動の実行 | + +## 現在の構成 + +論理層(UObject非依存) → データ層 → Actor層 の順に依存する。 + +- **論理層** + - `FGridMath`: セル座標とワールド座標の変換、範囲判定、グリッド中心 + - `FGridState`: 1マスごとの歩行可否・高さ・占有ユニットID + - `FGridPathfinder`: ダイクストラで到達可能マスを求め、経路を復元する(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への移行(操作が増えた場合)