Imported from BruiseBuill/AI-Tower (
AGENTS.md). Install upstream withnpx skills add BruiseBuill/AI-Tower. Copyright stays with the author.
AIOnly AI 协作规则
本文件是所有 AI 在修改本项目之前必须阅读的入口。项目知识库索引位于
Docs/KnowledgeBase/README.md。
强制规则
- 禁止 AI 执行任何 Git 或其他版本控制命令,包括但不限于初始化、状态查询、 拉取、提交、推送、切换分支、合并、回滚、暂存和修改版本控制配置。
- 禁止 AI 上传或下载项目、代码、资源及构建产物。未经用户明确授权,不访问网络 获取包、资源或远程内容。
- 修改前先阅读知识库中与任务相关的文档;修改后同步更新受影响的知识库内容。
Assets/Scripts/BaseFramework必须保留。可以按任务逐步修改,但不得整体删除、 绕过或替换;重大改造应先说明影响并得到用户确认。- 用户提供的正式美术、音乐和语音是最终素材。AI 默认只使用简单几何图形、纯色、 Unity 内置资源或已有占位资源,不擅自生成最终素材。
- 玩法数据、关卡数据和素材引用应尽量数据驱动,避免把关卡数值、资源路径或正式 素材直接硬编码在运行时代码中。
- 运行时资源必须通过稳定标识或统一目录引用,使占位素材可在不修改玩法代码的前提 下替换。
- 目标平台优先级为 Android;Windows 编辑器仅用于开发和鼠标模拟。交互必须同时 支持单指触屏与鼠标左键,不能依赖键盘完成玩家流程。
- 游戏仅为中文、单机。未经用户确认,不加入联网、账号、排行榜、广告、内购或 多语言系统。
- 不主动添加自动化测试、截图验收或复杂 CI。每次交付必须说明用户在 Unity 中可 如何手动验证,并报告尚未验证的部分。
- 不随意升级 Unity、渲染管线或第三方插件。版本变更必须作为独立任务,经用户明确 同意后进行。
- 不直接修改
Library、Temp、Logs、obj等 Unity 生成目录。项目源文件只应 位于Assets、Packages、ProjectSettings、Docs等受控目录。 - 不得把当前知识库中的“待确认问题”自行当作已确定需求。若某项决定会显著影响 玩法、存档兼容性或内容生产,应先向用户确认。
每次任务的最小流程
- 阅读
Docs/KnowledgeBase/README.md及其中相关文档。 - 检查当前代码、场景和资源,区分已有实现与计划中的实现。
- 进行范围明确、可回退的修改,避免无关重构。
- 检查 Unity 控制台或可用编译日志;不得把旧日志直接当作当前结果。
- 给出简短的手动验收步骤,并更新知识库中的实现状态或决策记录。
当前最高优先级
首个可运行的最小垂直切片已经建立(选关入口 Assets/Scenes/LevelSelect.unity,战斗场景
Assets/Scenes/Level001.unity;当前已增加可运行的第 2 关占位场景 Assets/Scenes/Level002.unity)。后续正式玩法扩展应继续保持一张地图、直线推进与塔拦截、
至少一种进攻单位、一种防御塔、最小部署操作、胜负结算和最小存档闭环可独立运行。具体新增
规则仍需用户确认,见
Docs/KnowledgeBase/OPEN_QUESTIONS.md。
当前架构基线(2026-09-08)
- 士兵、防御塔与玩家按对象拆分目录;静态配置是
Game.Content.SoldierData/Game.Content.TowerData/Game.Content.PlayerDataScriptableObject,统一存放在Assets/Game/Content/ScriptableObjects/的职责子目录(Player、Soldiers、Towers、Bases、Projectiles,关卡配置位于Levels子目录),运行时状态是SoldierRuntimeData/TowerRuntimeData。 PlayerData独占玩家能量初始值、上限、恢复速率和默认可部署的全部士兵;LevelDefinition只保存关卡名、时限和敌方布阵(大本营及防御塔位置)。稳定关卡 ID 与运行场景路径保存在LevelCatalog.Entry,不写入关卡数据体。- 关卡递进由
Game.Content.LevelProgressionDefinitionScriptableObject 保存稳定关卡 ID 顺序和 前置通关 ID,资产位于Assets/Game/Content/ScriptableObjects/Levels/LevelProgression.asset。 玩家胜利记录仍由Game.Save.SaveService写入本地存档;选关解锁和胜利后的下一关导航均按稳定 ID 读取,避免依赖场景对象引用。 - 当前生产配置资产为
Def_Player_Data、Def_Soldier_Basic_Data、Def_Soldier_Heavy_Data、Def_Soldier_Elite_Data、Def_Soldier_Charge_Data和Def_Tower_Basic_Data;旧的同名无_Data资产已清理, 不再维持额外兼容资源。当前另有Def_Tower_Explosive_Data、Def_Tower_Laser_Data、Def_Tower_Piercing_Data及Def_Projectile_Explosive/Laser/Piercing,用于特殊子弹塔型。 - 士兵直线移动、塔吸引、近战攻击,防御塔索敌、炮击分别是独立模块;对象控制器只负责 初始化、生命周期和对外战斗契约。士兵靠近塔时塔优先于大本营。
- 战斗结束、重试和新战斗装配前会关闭已注册战斗实体并清理对象池,避免持久化
PoolManager中残留上一局士兵、塔或炮弹;BackToPool对重复回收幂等,不会将 已在队列中的对象再次入队。 - 每个兵种和塔型使用独立 Prefab;首个关卡当前有突击兵、重装兵、精英兵和蓄力兵四种兵种。
战场输入由
Game.Input.BattleInputManager继承BF.InputManager,点击按Click触发普通兵种, 长按释放按LongPressRelease触发蓄力兵。暂停面板可返回选关,胜利结算提供下一关入口(无下一关时返回选关)。 当前选关入口是Assets/Scenes/LevelSelect.unity(构建列表首位);战斗场景的生产入口是AIOnly/构建垂直切片场景,选关场景的生产入口是AIOnly/构建选关场景,关卡数据入口是AIOnly/关卡编辑器。 - 当前炮击伤害由
Game.Content.ProjectileDefinition.Damage承载,Game.Content.TowerData只负责塔的生命、射程、攻击间隔和子弹引用;新增代码应依赖SoldierData/TowerData、ProjectileDefinition及新模块类,不再把运行时状态命名为配置数据。ProjectileDefinition.Type当前支持追踪、爆炸、激光和穿射;爆炸范围/减速、激光递增伤害和 穿射判定均由子弹定义与运行时模块负责。 - 旧的
SoldierDefinition、TowerDefinition、旧模块包装类及未被首关引用的旧资产已清理, 不再维持额外兼容壳。HUD 顶部能量条使用 Filled Image 按当前能量比例增长,屏幕底部不再显示 兵种消耗提示文本。 AIOnly/关卡编辑器的“生成塔到当前场景”按钮可在非运行状态下按当前关卡布阵生成塔预览; 预览统一放在__LevelEditorTowerPreview下,进入运行模式时由BattleSetup清理后再装配运行时塔; “从当前场景同步塔布阵”按钮可将当前运行场景中的塔 Prefab 按TowerData反查后整体写回关卡数据, 同步支持 Undo,且不会自动改变现有首关布阵。Assets/Scripts/Game/已按职责整理为SceneObject、UI、Level、Player、Editor、System六个顶层目录:战斗对象及其配置位于SceneObject,UI 位于UI,关卡与选关位于Level, 玩家输入/配置/存档位于Player,编辑器工具位于Editor,公共流程与共享配置基类位于System。 本次整理只调整物理路径,C# 命名空间和脚本.metaGUID 保持不变。- 选关代码独立位于
Assets/Scripts/Game/Level/LevelSelection/,静态地图布局资产位于Assets/Game/Content/ScriptableObjects/Levels/LevelSelectionMap.asset;节点通过稳定关卡 ID 关联LevelCatalog,不把选关逻辑混入战斗代码。地图内容由MapViewport(Mask+ 横向ScrollRect)承载,可用鼠标左键和单指触摸拖动;节点短按选中,长按约 0.8 秒并释放后进入有 效场景的关卡,长按显示旋转径向进度环。 - 当前选关地图默认生成 5 个线性节点;只有
LevelCatalog中存在且已满足前置通关记录的节点 才可进入;当前level_002已有可运行占位场景,其余节点显示“未解锁”或“内容准备中”。线性解锁仍是默认方案,最终规则见Docs/KnowledgeBase/OPEN_QUESTIONS.md。 - 战斗 HUD 在战场长按时复用
BF.InputManager输入事件,在按下位置显示旋转径向进度环;点击、拖动 或释放后清除反馈。类继承关系和对象组件清单见Docs/HUMAN_READ_ONLY.md。 - 战斗开始前由
BattleSetup使用BattleNoDeployZone创建 Tilemap,按每座塔的TowerData.NoDeployAreaSize绘制并合并不可部署矩形;塔消失后区域不变,部署校验与该 Tilemap 共用。