geometry-tower-defense/CLAUDE.md

8.4 KiB
Raw Blame History

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

项目概述

几何塔防 (Geometry TD) - 塔防肉鸽游戏。使用 Unity 引擎,基于 GameFramework 游戏框架构建。

构建与开发

  • 打开项目: 使用 Unity Hub 加载 GeometryTD 目录
  • 运行: Unity Editor 中点击 Play 按钮(无 CLI 方式)
  • 构建: File > Build Settings 选择目标平台
  • IDE: 打开 GeometryTD.slnAssembly-CSharp.csproj 进行 C# 开发

启动流程

GameEntry 是游戏主 bootstrap 类。流程切换通过 ChangeState<T> 驱动,数据传递使用 procedureOwner.SetData

游戏启动路径:Assets/Launcher.unityProcedureMenuMenu.unityMain.unity

架构概览

目录结构

Assets/
├── GameFramework/     # 游戏框架(来自 gameframework.cn
├── GameMain/
│   ├── Scripts/        # 游戏逻辑代码
│   │   ├── Base/           # GameEntry 等基础组件
│   │   ├── Components/      # 组件InputComponent, TowerController 等)
│   │   ├── CustomComponent/# 自定义组件UIRouterComponent 等)
│   │   ├── DataTable/      # 数据表DR* 前缀,如 DREnemy, DRTag
│   │   ├── Definition/     # 枚举、Struct 定义
│   │   ├── Entity/        # 实体系统EntityBase, EntityData, EntityLogic
│   │   ├── Event/         # 事件定义
│   │   ├── Factory/       # 工厂类
│   │   ├── Procedure/     # 流程状态机FSM
│   │   ├── Scene/         # 场景相关
│   │   ├── UI/           # UI 系统
│   │   └── Utility/       # 工具类
│   ├── Scenes/          # Unity 场景Menu.unity, Main.unity
│   ├── DataTables/      # 数据表资源
│   └── Configs/         # 配置文件
└── Tests/              # 编辑器模式测试

UI 架构 (MV* + UseCase 模式)

UI 采用 Context/Controller/UseCase/View 分层:

UIFormController (接口)
    └── UIFormControllerBase<TContext> (泛型基类)
            └── SpecificController (如 ShopFormController)

IUIUseCase (用例接口)
    └── SpecificUseCase (如 ShopFormUseCase)

UIContext (UI 状态)
    └── SpecificContext (如 ShopFormContext)

View (MonoBehaviour)
    └── SpecificView (如 ShopForm)
  • Controller: 处理 UI 交互逻辑,实现 IUIFormController
  • UseCase: 封装业务逻辑,实现 IUIUseCase
  • Context: UI 状态数据,传递给 Controller
  • View: Unity MonoBehaviour处理 UI 表现

实体系统 (Entity System)

基于 GameFramework 的实体系统:

EntityLogic (GameFramework)
    └── EntityBase
            ├── Player
            ├── EnemyEntity
            ├── TowerEntity
            └── BulletEntity

EntityData (数据对象)
    └── EntityDataBase
            ├── PlayerData
            ├── EnemyData
            └── TowerData

流程系统 (Procedure/FSM)

游戏流程使用状态机管理:

ProcedureBase
    ├── ProcedureMenu      # 菜单流程
    ├── ProcedureChangeScene # 场景切换
    └── ProcedureMain      # 主游戏流程(可能存在)

状态转换通过 ChangeState<T> 触发,数据传递使用 procedureOwner.SetData

组件系统 (Components)

塔防组件系统用于组装防御塔:

BasicBaseComp    # 底座组件
BasicBearingComp # 轴承组件
BasicMuzzleComp  # 枪口组件
ShooterMuzzleComp
ShooterBullet
MovementComponent
InputComponent

数据表 (DataTable)

数据驱动的设计,数据表类以 DR 前缀:

DREnemy, DRTag, DRLevel, DRScene, DRShopPrice,
DROutGameDropPool, DRTagConfig, DRRarityTagBudget

数据表资源在 Assets/GameMain/DataTables/,代码在 Assets/GameMain/Scripts/DataTable/。开发时编辑 数据表/ 目录下的数据表,导出后同步到 Assets/GameMain/DataTables/

标签系统 (Tag System)

组件产出Tag 生成/掉落/奖励候选)由 InventoryGenerationComponent 统一运行时入口,编排 DropPoolRollerRewardCandidateBuilderOutGameDropRuleService

正式首发 7 Tag FireIceCritExecutionShatterInfernoAbsoluteZero

明确后移 5 Tag仅占位配置未生效 BurnSpreadIgniteBurstFreezeMaskPierceOverpenetrate

运行时规则:

  • Tag 在组件实例创建时随机;组塔阶段只汇总,不重新随机
  • 重复 Tag 不丢弃,组塔时转为塔级 Stack
  • 战斗载荷保存塔级 TagRuntimeData[]

详见 docs/TagSystemDesign.md

商店与 RepoForm

ShopNode 只承载玩家购买组件的逻辑;RepoForm 负责出售功能commit 2e54acb)。两者职责分离,不得交叉。

战斗节点系统 (CombatNode)

CombatNodeComponent 是战斗域的入口门面Facade不持有战斗内资源真值。核心架构

CombatNodeComponent入口
    └── CombatScheduler状态机管理器
            ├── CombatLoadingState
            ├── CombatRunningPhaseState
            ├── CombatWaitingForPhaseEndState
            ├── CombatSettlementState
            ├── CombatRewardSelectionState
            ├── CombatFinishFormState
            ├── CombatWaitingForReturnState
            └── CombatFailedState

CombatScheduler 持有:
    ├── CombatRunResourceStore   # Coin/Gold/BaseHp/背包快照 唯一真值来源
    ├── EnemyManager             # 敌人域 Facade
    ├── PhaseLoopRuntime         # Phase 运行时与结束标记
    └── InventoryGenerationComponent  # 组件产出统一入口

核心不变量(必须保持):

  • CombatScheduler 只做状态机管理与共享运行时收口,不继续吸收具体业务细节
  • 状态切换只能通过 CombatScheduler.ChangeState(...) 完成
  • 敌人事件处理入口不直接切状态,状态只能在自己的 OnUpdate 中决定迁移
  • MapEntity 通过 MapData + Event 获取战斗上下文,不反查 Combat 域内部运行时
  • 组件产出规则以 InventoryGenerationComponent 为统一运行时入口

详见 docs/CombatNodeArchitecture.md

测试

测试位于 Assets/Tests/EditMode/ 目录下,使用 Unity Test Framework 运行。在 Unity Editor 中通过 Window > General > Test Runner 执行。运行单个测试:选中目标测试,点击 Run Selected

编码规范

  • 缩进: 4 空格 + Allman 大括号风格
  • 命名: 类型/方法/公开成员 PascalCase,局部变量/参数 camelCase
  • 命名空间: GeometryTD.* 按功能区域划分
  • 断言优先: 使用 Debug.Assert 而非静默忽略错误

详见 AGENTS.md 中的完整编码原则。

关键设计文档

  • docs/CombatNodeArchitecture.md - CombatNode 战斗系统架构规范(含命名后缀词典)
  • docs/TagSystemDesign.md - 标签系统设计
  • docs/MapEntityArchitecture.md - 地图实体架构
  • design/gdd/systems-index.md - 核心系统索引与优先级

命名后缀规范

命名后缀具有严格语义约束:

后缀 用途 示例
Scheduler 状态机边界/阶段推进总控 CombatScheduler
Manager 子域 Facade/聚合入口 EnemyManager
Coordinator 跨状态/跨服务的流程编排 CombatSchedulerCoordinator
Service 聚焦业务行为 OutGameDropRuleService
Calculator 纯计算与结果组装 CombatSettlementCalculator
Session 一次生命周期对象 CombatLoadSession
Bridge 框架边界适配器 CombatEventBridge
Runtime 运行时可变状态承载 PhaseLoopRuntime
Context 被动数据包/共享上下文 CombatSettlementContext
Result 动作输出/结算产出 DropResult
Flags 布尔控制项聚合 CombatFlowFlags
Resolver 映射/查找/判定/解析 EnemySpawnPathResolver
Tracker 跟踪运行中实体或事实真值 EnemyLifecycleTracker
Port 受限宿主接口 ICombatNodePort

数据工作流

  • 开发时编辑 数据表/ 目录下的数据表
  • 导出后同步到 Assets/GameMain/DataTables/
  • 数据表代码在 Assets/GameMain/Scripts/DataTable/DR 前缀)