Files
daluandou/CODELY.md
T
huadexuan ec35c6c154 根据提供的code differences信息,由于没有具体的代码变更内容,我将生成一个通用的commit message模板:
```
docs(readme): 更新文档说明

- 添加项目使用指南
- 完善API接口说明
- 修正错误的配置示例
```

注意:由于您提供的code differences部分为空,以上是一个示例模板。当您有具体的代码变更时,请提供详细的变更内容以便生成更准确的commit message。
2026-10-12 18:06:46 +08:00

161 lines
65 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Codely Structured Memories
### User
- [2026-09-09 13:43:50] 用户是 10 年 Java 后端开发,可以提供后端接口,但当前项目处于原型验证阶段,暂不需要服务器。
### Feedback
- [2026-08-28 11:36:37] 用户偏好 Unity 操作分步骤执行:一次只做一个明确动作并先验证结果,避免连续执行大量工具调用导致超时。**Why:** 之前连续操作出现 Stream idle timeout。**How to apply:** Unity 场景、Prefab、组件和运行验证都采用“读取→单步修改→确认”的节奏。
- [2026-08-30 22:44:50] 每实现一个角色技能,都要同步更新《场景和角色设计.md》文档末尾的角色与技能描述表格。**Why:** 用户希望实现进度与设计文档保持同步。**How to apply:** 后续新增或修改角色技能时,在同一任务中追加或更新对应表格行。
- [2026-08-31 14:52:17] 角色配色应以自然、克制的主体色为主,每个角色加入一到两处对比度较强的颜色作为识别点,避免整体过于花哨或过于朴素。**Why:** 用户希望角色既有视觉记忆点,又保持统一、易建模的造型。**How to apply:** 后续角色提示词使用材质和种族决定主体配色,仅在围巾、护腕、局部毛色等少量位置加入强对比色。
- [2026-08-31 15:30:02] 角色技能表中的攻击速度应以“普攻间隔(秒/次)”展示,而不是“次/秒”。**Why:** 用户更直观地关注单位每隔多少秒攻击一次。**How to apply:** 后续新增或调整角色数值时统一使用秒/次,并按间隔数值维护平衡。
- [2026-09-01 14:10:12] 用户在 Unity 脚本或 Animator 问题排查中可优先要求“先改、不运行验证”,此时只执行读取、针对性修改和必要的编译/配置确认。**Why:** Play Mode 或视频验证容易触发 Stream idle timeout。**How to apply:** 除非用户明确要求运行验证,否则遇到类似超时后先不进入 Play Mode。
- [2026-09-03 14:32:39] 眩晕状态特效应优先使用 Unity Particle System,并以星星贴图作为粒子,而不是用运行时复制多个 Sprite 作为最终实现。**Why:** 用户明确希望得到真正的粒子效果,Sprite 复制只能作为临时占位。**How to apply:** 后续制作眩晕及类似循环状态特效时,优先创建可复用的粒子 Prefab 并接入通用状态系统。
- [2026-09-04 10:39:23] 后续所有角色图片生成提示词禁止出现米白色衣服,并一并排除象牙白、奶油白、乳白色及其他近似暖白色服装。**Why:** 用户明确要求角色服装不再使用米白色。**How to apply:** 新增或改写任何角色提示词时,服装与护甲优先使用明确的冷色、深色或自然色,并在提示词中写出排除项。
- [2026-09-04 11:21:06] 角色辨识度优先依靠大轮廓、简化脸部、职业特征大色块和少量核心识别点,不依赖复杂细节或精细贴图;尤其要适配 2.5D 远距离显示。**Why:** 用户希望即使模型和贴图较粗糙,也能一眼识别角色职业与身份。**How to apply:** 后续角色提示词优先设计头部框架、面部符号、服装剪影和能力核心,控制小装饰与高频纹理。
- [2026-09-04 14:12:02] 需要 Play Mode 验证时先询问用户,由用户手动点击 Play 并反馈结果,不要自动进入 Play Mode。**Why:** 可节约时间并避免 Unity 运行验证导致工具等待或超时。**How to apply:** Unity 动画、角色行为和运行时问题排查中,完成编辑态修改后停在编辑器等待用户验证。
- [2026-09-05 10:16:49] Unity 运行验证默认不由助手自动进入 Play Mode;完成编辑态修改、编译和场景保存后,等待用户手动点击 Play 并反馈结果。**Why:** 用户希望避免运行验证导致等待或超时。**How to apply:** 角色、动画 Event 和技能接入任务优先做编辑态验证,除非用户明确要求自动运行测试。
- [2026-09-09 12:11:59] 当用户明确指出现象和修复目标时,优先按用户给出的事实做针对性修改,不继续进行冗长排查。**Why:** 用户明确指出法师没有生成火球,并要求直接给新建火球 Prefab 补脚本。**How to apply:** 先读取目标资产确认,再执行最小必要修改;只有修改仍失败时才扩大排查范围。
- [2026-09-09 13:43:50] 能量恢复速度应该更慢一些,用户建议改为 3 秒恢复 1 格。**Why:** 1 秒 1 格太快,不利于战斗节奏控制。**How to apply:** 召唤系统能量恢复速率应偏慢,给玩家资源压力。
- [2026-09-09 20:37:24] 用户希望提前实现数据架构而非临时方案,即使当前阶段功能简单。**Why:** 用户有 10 年后端开发经验,理解数据分层的重要性,希望逐步完善而非推倒重来。**How to apply:** 对于有明确扩展方向的功能(升级、存档、联网),优先设计可扩展架构并临时写死数据,而非等需求明确后再重构。
- [2026-09-10 18:38:45] 正交俯视视角(38-43°)下,垂直墙面几乎看不见(只能看到墙顶),因为墙面平行于视线方向被自身遮挡。适合的装饰物:高耸物体(旗帜、石柱)、有明显剪影的物体(木箱、碎石堆)、对比色强的物体;不适合:低矮平面物(矮墙、栅栏)、细长水平物(绳索)。**Why:** 这是正交俯视视角的固有盲区,无法通过调整角度完全解决(角度太平会牺牲战场全局视野)。**How to apply:** 场景装饰设计时优先使用垂直高度≥2米的物体,避免依赖水平或低矮结构。
- [2026-09-14 18:24:56] 用户认可"参考游戏是基地离得远、镜头更远、单位推进慢"的观感方向(2026-09-14 数值改慢后反馈"好多了")。**Why:** 之前双方距离近+移速快,单位两三秒就接触,战斗缺乏观察窗口。**How to apply:** 后续地图/镜头调整优先加长双方距离、拉远摄像机;数值宁慢勿快。
- [2026-09-16 22:18:14] 召唤系统:找不到合适位置时直接在召唤师前方强制生成,不显示警告,不退还能量。**Why:** 用户要求召唤必须成功,不被取消。**How to apply:** MainCharacterCombat.cs 的召唤逻辑
- [2026-09-16 22:18:30] 召唤打断移动:主角点击召唤时必须立即停止移动,调用 SummonerClickMovement.ClearTarget() 来实现。**Why:** 用户要求召唤时即使在移动也要立刻停下。**How to apply:** BeginSummon 开始时停止移动
- [2026-09-17 10:06:34] 召唤师移动后连续召唤动画超时问题:SummonerClickMovement.HandleMovement() 每帧设置 animator.SetInteger("speed", 1) 干扰召唤动画。**Why:** 即使召唤时调用了 ClearTarget(),下一帧 Update 还是会覆盖动画参数。**How to apply:** 召唤期间禁用移动脚本 (clickMovement.enabled = false),召唤完成后重新启用 (enabled = true)。已在 MainCharacterCombat.Summon() 和 FinishSummon() 中实现。
- [2026-09-18 17:16:47] 小游戏阶段优先使用低成本的材质发光方案(Emission 球体 + 一层透明 Additive 光晕),不使用实时灯光、粒子系统和全屏 Bloom。**Why:** 用户关注小程序性能,且项目为内置渲染管线;Bloom 会影响整屏性能。**How to apply:** 后续制作阵营识别光球、传送门能量等发光效果时默认走材质光晕路线,仅在高端设备上考虑 Bloom。
- [2026-09-29 22:28:50] 英雄复活后不寻敌问题:需要在ReviveHero()中调用unitBase.ResetAnchorPosition()重置锚点位置,否则returnToAnchorWhenIdle=true的英雄会尝试返回旧锚点位置导致卡住
- [2026-10-01 15:45:16] UnitBase动画速度问题:攻击时会设置animator.speed来调整攻击动画速度,但攻击结束后必须在Alert状态和ReturnToAnchor中重置为1.0,否则会导致后续移动动画变慢
- [2026-10-01 15:45:27] 投射物方向问题:使用transform.Translate(Vector3.forward)的投射物必须在Instantiate时计算正确的旋转Quaternion.LookRotation(direction),否则会朝默认方向飞行。已在UnitBase.FireProjectile和FireSkillProjectile中修复
- [2026-10-02 10:27:11] 石巨人地裂技能职责:命中帧实例化并调用 `ShockwaveRing.Play()` 播放地面扩散光圈;范围伤害与眩晕分开处理,`UnitBase.ApplyAreaStun()` 只给范围内每个敌方角色调用其自身 `StatusEffectController.ApplyStun()`,星星特效由角色状态组件生成、跟随和清理。石巨人不应直接实例化眩晕星星特效。
- [2026-10-02 00:03:51] UnitBase fields: use unit.Camp (property), unit.IsAlive (property), NOT unit.camp or unit.isAlive (do not exist). StatusEffectController is private — access stun logic through public UnitBase methods only
- [2026-10-06 22:02:42] BuffSelectionController 卡牌 UI 边框修改规则:BuffCard 下 buffImage 节点的 RectTransform、Scale 和 Position 均由用户在 Unity Editor 中手工调整确定,脚本只能修改 borderImage.sprite 动态替换边框贴图,绝对不要在代码中重置或修改 transform 属性。
- [2026-10-10 21:12:09] 全新克隆/换仓库后出现大量Missing Script或脚本存在但报错未挂载时,通常是Unity脚本导入未绑定(MonoScript.GetClass为空),需对Assets/Scripts批量AssetDatabase.ImportAsset(ForceUpdate)刷新绑定,而非直接重构代码。
### Project
- [2026-08-28 14:26:56] 弓箭手远程箭矢的设计要求:保持发射时高度水平飞行,命中目标后直接结算伤害并销毁,不产生实体物理击退。**Why:** 当前玩法希望远程攻击是命中判定而非物理推动。**How to apply:** 后续调整箭矢、Projectile 或弓箭手攻击逻辑时保持这一行为。
- [2026-08-28 18:06:13] 小游戏对外名称确定为《召唤之战》,整体采用竖屏布局;主界面不需要“技能、背包、属性”入口或相关模块。**Why:** 备案与产品定位已确定,UI 需保持简洁并适配竖屏。**How to apply:** 后续设计备案图、主菜单或游戏 UI 时遵循此名称、方向和功能范围。
- [2026-08-29 11:44:51] 《召唤之战》战斗设计倾向简化:单位解锁后立即拥有完整技能,升级只提升基础数值;战斗召唤栏采用底部正方形头像卡片,战斗场景第一版优先将背景图贴到现有 BattlePlatform,而非制作完整3D场景。
- [2026-08-31 11:31:00] 角色图片生成统一采用 3D 卡通、非写实、单角色正视图;人形角色使用标准 A-pose,非人形角色使用稳定自然姿态。**Why:** 便于 3D 建模与动画制作,并符合《召唤之战》的视觉方向。**How to apply:** 后续新增各章节角色提示词时遵循该标准,并记录在《角色与技能说明.md》。
- [2026-09-02 16:44:35] 主角定位确定为“召唤师优先、法师辅助”的人类召唤师,主要战斗力来自召唤单位,主角仅用基础法术补刀和牵制;视觉上需要通过召唤核心、学院符文和独特剪影与普通法师区分。**Why:** 保持召唤系统的核心地位并提高主角辨识度。**How to apply:** 后续主角技能、模型、动画和 UI 设计都应围绕召唤师身份展开。
- [2026-09-02 23:50:59] 《召唤之战》状态效果方案确定:所有可控制单位共用 Stun/StatusEffect 系统,眩晕暂停当前 Animator 与战斗逻辑,使用通用头顶星星提示,重点角色以后再补专属眩晕动画。**Why:** 降低首版制作量并保持各单位行为一致。**How to apply:** 新增眩晕、减速、沉默等控制效果时优先扩展通用状态组件,不在技能脚本中直接操作具体角色动画。
- [2026-09-03 18:09:56] 《召唤之战》大招统一在下一次普攻开始前判定:先通过现有寻敌逻辑获得有效目标,能量满则优先释放大招并消耗能量,跳过本次普攻;没有有效目标时不释放且保留能量。**Why:** 避免普攻命中击杀目标后仍立即触发大招。**How to apply:** 后续新增或修改角色技能时遵循该统一触发时机。
- [2026-09-03 18:52:21] 《召唤之战》采用 2.5D 战斗呈现,角色设计需要在俯视斜角和远距离下保持清晰剪影与可读的大色块。**Why:** 用户希望角色在实际战斗镜头中仍容易区分。**How to apply:** 后续角色图片、模型、服装和特效设计优先考虑 2.5D 视角下的轮廓识别,不依赖细小装饰。
- [2026-09-03 19:12:39] 角色图片提示词与游戏内装备分离:盾卫的角色本体图片必须明确不出现盾牌,塔盾作为独立武器/装备资产单独生成与配置。**Why:** 便于后续替换和挂载装备,避免角色模型自带盾牌影响游戏配置。**How to apply:** 后续生成盾卫或其他可换装角色图片时,只描述身体与服装本体,不把可独立配置的装备画进角色图。
- [2026-09-06 22:14:43] 《召唤之战》当前先确定每关携带 5 种角色,战斗中固定显示 5 张召唤卡;UI 采用大框底图加独立可复用卡片、角色头像和运行时状态元素。**Why:** 先控制竖屏战斗界面复杂度并便于调试。**How to apply:** 后续召唤 UI、卡组和能量系统按 5 个固定卡位设计,不把动态文字、冷却和能量豆烘焙进静态图片。
- [2026-09-09 12:23:17] 攻击系统已从动画结束 Event 改为攻击命中 Event 触发。UnitBase 通过 OnAttackEffect() 统一处理四种攻击类型:MeleeDirect(近战直接伤害,已实现)、RangedProjectile(远程锁敌飞行物,已实现)、MeleeArea(近战范围,预留)、RangedArc(远程抛物线,预留)。攻击动画结束由脚本自动检测 normalizedTime,不再依赖 OnAttackAnimationEnd Event。**Why**: 用户需要远程攻击等箭矢碰撞后才扣血,而非动画中途直接伤害。**How to apply**: 所有攻击动画只需在命中帧添加 OnAttackEffect Event;近战保持 MeleeDirect,远程单位设为 RangedProjectile 并配置 projectilePrefab/projectileSpawnPoint。
- [2026-09-09 20:37:24] 召唤能量和冷却系统已完成,玩家角色数据架构已完成:ManaSystem 单例管理能量(最大 10,3 秒恢复 1 点),MainCharacterCombat 扩展能量检查(人类士兵消耗 2,弓箭手消耗 3),SummonCardButton 接入冷却逻辑(5 秒冷却,UI 显示遮罩和倒计时),能量豆 UI 已配置,冷却遮罩在非冷却时完全隐藏。CharacterData 支持基础属性和升级成长,PlayerCharacterData + PlayerDataManager 实现玩家角色等级和属性计算,召唤时传递最终属性给 UnitBase。
- [2026-09-09 20:37:24] 玩家角色数据架构已完成:CharacterData 存储基础属性(1级)和成长值(每级加成),PlayerCharacterData 存储玩家角色等级和星级,PlayerDataManager 单例管理玩家拥有的角色和当前卡组(临时写死)。召唤时从 CharacterData + PlayerCharacterData 计算最终属性并传递给 UnitBase.InitializeFromPlayerData()。升级系统正常工作(1级 100血/50攻,3级 120血/60攻)。后续扩展:存档系统、卡组配置界面、升级界面、角色解锁、后端接口。
- [2026-09-09 22:17:58] 第一关地图重新设计已完成:地图扩展到120单位(Z: -24到96),创建3个波次生成器(WaveSpawner)在Z=25/55/85,添加视觉标识物(旗帜、石柱、石墙)标记战斗区域。摄像机修正:旋转(43,0,0)位置(0,18,-5),朝向+Z方向与主角前进方向一致。召唤系统优化:初始状态无冷却遮罩,冷却时间从5秒改为1秒(能量已控制召唤频率)。
- [2026-09-10 11:03:00] 第一章第一关地图(Level1-1.scene)已完成:120单位长地图(Z: -24到96),使用用户自制的6类真实3D模型装饰(石墙/木栅栏/旗帜/木箱/石柱/碎石堆),共34个物体分布在左右装饰带和3个波次标记位置。摄像机设置为2.5D视角(位置0,18,-5,旋转43°)。**Why:** 地图基础结构已完成,可以开始添加战斗逻辑和敌人生成器。**How to apply:** 后续关卡可复制此场景作为模板,调整装饰布局即可。
- [2026-09-10 18:38:13] 第一关地图(Level1-1.scene)已采用"皇室战争"风格简化设计:移除所有边界矮墙(俯视角只能看到墙顶),改用旗帜+石柱交替排列标识边界(X=±5.5,Z轴8个位置交替);保留中间战道掩体(木箱×6、碎石堆×4);天空改为纯色蓝灰色+线性雾效(起始40m,结束100m);摄像机添加边界Clamp限制(X: -7~7, Z: -32~93,宽松模式),主角靠近边界时摄像机停止跟随;光照调整为从后上方照射(50°, 0°, 0°),角色正面清晰可见。**Why:** 正交俯视视角下垂直墙面几乎看不见(只能看到墙顶),旗帜+石柱有高度和轮廓,视觉识别强。**How to apply:** 后续关卡延续此风格,避免使用低矮平面装饰物。
- [2026-09-10 18:38:32] 召唤逻辑已优化碰撞处理:当目标位置被占用时,自动螺旋搜索周围空位(左右搜索8次×前后3层×2方向,约102个候选点);如果所有位置都被占用,自动退还能量豆并取消召唤,避免浪费能量。参数:summonSearchCount=8, summonDepthSearchCount=3, summonSearchStep=0.8f, summonDepthSearchStep=1f。
- [2026-09-11 14:55:27] 敌人血条颜色问题已修复:WorldHealthBar 在 Awake() 时根据 GameObject.tag 判断颜色,WaveSpawner 在 Instantiate() 后设置标签会导致时序错误(血条已创建成绿色)。解决方案:直接在敌人 Prefab 上设置 Enemy 标签,确保 Awake() 时标签已正确。已修改狼人/蓝色怪物/弓箭猎人/石巨人四个 Prefab。**Why:** 血条颜色在对象创建时确定,后设置标签无法自动刷新。**How to apply:** 后续新增敌人 Prefab 时直接在 Prefab 上设置 Enemy 标签,不依赖运行时代码设置。
- [2026-09-16 14:22:13] 2026-09-13 玩法大转向:从闯关推图改为"建筑生产+自动作战+主角辅助"的对攻玩法(见《召唤之战-核心玩法.md》)。旧闯关玩法由用户在另一台电脑的分支保存,当前 main 按新玩法开发。提交 beab4cf 已实现:GoldSystem/GoldMine 金币经济、Barracks 兵营产兵、BuildingPlacementManager 建筑摆放、CharacterData 新增 productionInterval/buildingCost、UnitBase/Projectile 支持攻击建筑、CoreBattleTest.scene 验证场景、CameraFollow 重写(WASD/鼠标/触摸拖动+缩放)。胜负目标改为摧毁对方主建筑。**How to apply:** 2026-09-16 起玩法进一步改为"召唤师对决"(见同日新条目),建筑/经济/产兵系统已封存、不再作为主线,相关脚本留作素材。
- [2026-09-14 18:24:46] 2026-09-14 性能实测(9 个角色 Prefab):大多数 5~8k 三角面/22 骨骼/512 贴图,性能没问题;两个待处理异常——蓝色怪物 34408 面(是量产低价单位,建议减面到 8k 左右)、法师贴图 2048x2048(建议缩到 512)。另建议设计层限制每方场上单位上限(约15)保性能与 2.5D 可读性,并确认方向光关实时阴影,最终以低端安卓真机小游戏包为准。**How to apply:** 后续做性能优化或新增量产型敌人时按此基准控制面数。
- [2026-09-14 21:19:53] 2026-09-13 新增建筑系统核心脚本:BuildingHealth(建筑血量+生产进度接口)、GoldSystem/GoldMine(金币经济与产出)、Barracks(兵营产兵,读取 CharacterData.productionInterval)。WorldHealthBar 增加 SetEnergy() 通用下方条接口,建筑复用该条显示生产进度,单位仍用于技能能量。BuildingPlacementManager 支持虚拟网格吸附、占位检测、金币扣除,新放置建筑自动挂 BuildingHealth。UnitBase/Projectile 的 ApplyDirectDamage/ApplySkillHit/ApplyAreaSkillDamage/HitTarget 均已接入 BuildingHealth,建筑可被近战/技能/范围/飞行物伤害。兵营 Prefab(Assets/Prefabs/建筑/兵营.prefab)已写入 Barracks+WorldHealthBar+BuildingHealth,默认阵营 Friend,场景实例保留 Enemy 覆盖。**Why:** 建筑作为可攻击目标是新对攻玩法的核心,生产进度条复用血条下方条避免额外 UI。**How to apply:** 后续新增建筑类型(防御塔/资源建筑)参照 BuildingHealth 接口;修改血条下方条逻辑时注意区分单位和建筑语义。
- [2026-09-14 21:34:17] 2026-09-14 发现:团结引擎 1.10.2 (macOS) 原生 NavMesh 烘焙失效——空场景放一个静态 Cube,用 NavMeshBuilder.BuildNavMeshData / UpdateNavMeshDataAsync / 经典全局 BuildNavMesh 烘焙全部产出 0 三角形,无报错;收集源(CollectSources)、Job 系统、AI 模块包均正常;换构建目标/域重载/重启编辑器均无效。**Why:** 原生导航烘焙在此安装上深层失效,继续用 NavMesh 会浪费时间。**How to apply:** 本项目寻路不要用 NavMesh/NavMeshAgent/NavMeshSurface,改用纯 C# 网格 A*(见 GridPathfinder.cs);若未来升级团结版本可先重跑最小 Cube 烘焙测试再决定。
- [2026-09-14 22:55:12] 2026-09-14 伤害数字系统(WorldHealthBar.SpawnDamageNumber + DamageNumber 组件)已上线:白字黑边样式(1 白主字 + 4 向偏移黑副本,TextMesh 无原生描边所以用副本组合),入口在 TakeDamage/Heal,全场并发上限 60。两个关键坑:1) TextMesh 可读面朝本地-Z,billboard 必须用 LookRotation(selfPos - cameraPos),方向写反会左右镜像;2) 同材质同 sortingOrder 的多个 TextMesh 渲染顺序不确定,后创建的黑色副本会盖住白字——必须显式分层:黑边 sortingOrder=60、白主字=61,白字必须最后创建或层级更高。**Why:** 用户要求白色黑边,先后修复了镜像和纯黑覆盖问题。**How to apply:** 后续做其他 3D 漂浮文字(暴击、金币)沿用 DamageNumber 模式、朝向写法和 sortingOrder 分层。
- [2026-09-15 08:09:51] 2026-09-15 决战玩法(BattleTest.scene)布阵系统已实现:BattleSetupManager 单例管理 Setup/Battle/Ended 三状态。布阵阶段:己方半场 2x2 米虚拟网格(X:-8~8, Z:-20~-8),底部 8 张卡片(代码生成 UI),点卡片选兵种→点格子放置(绿/红高亮预览),manaCost 作为人口消耗(上限 30),点已放单位可移除退人口。开战按钮生成敌方预设阵型(前排近战 Z=14 / 后排远程 Z=18,共 28 人口),全灭判定胜负(0.5 秒轮询)。SummonCardButton 已支持双模式:有 BattleSetupManager 走人口判断选兵,否则走金币建筑放置——两个场景共存互不干扰。**Why:** 用户确定决战玩法方向,网格布阵解决开局扎堆且让排兵布阵成为策略。**How to apply:** 后续决战玩法迭代(AI 阵型多样化、主角辅助技能、重开按钮)都基于 BattleSetupManager 扩展;不要在 CoreBattleTest 场景放 BattleSetupManager。
- [2026-09-15 16:03:53] NavMesh 寻路已成功接入所有单位。团结引擎完全支持 NavMesh(需安装 com.unity.ai.navigation 包)。实现方式:1) 添加 NavMeshSurface 组件并烘焙;2) 为所有角色预制体添加 NavMeshAgent;3) 修改 UnitBase.cs 的 move() 方法优先使用 NavMeshAgent.SetDestination(),并在 Start() 中禁用 CharacterController 避免冲突。CoreBattleTest 场景已创建中央分隔墙形成左右两路,单位能够自动沿路线寻路并绕过障碍物。
- [2026-09-15 17:33:54] NavMesh 寻路攻击漂移问题修复方案:单位攻击时会因 NavMeshAgent 继续工作而漂移。解决方法是在 attack() 方法和 Update() 的 State.Attack 分支中直接禁用 NavMeshAgent (navAgent.enabled = false),在 move() 方法中重新启用。同时修复了 applyGravity() 调用已禁用 CharacterController 导致的警告(添加 controller.enabled 检查)。性能优化:寻路路径更新频率限制为 0.5 秒一次(nextPathUpdateTime + PathUpdateInterval),减少 93% 路径计算开销。
- [2026-09-15 18:42:26] 伤害数字显示规则:友方单位(Friend tag)受伤显示红色数字向下浮动,敌方单位(Enemy tag)受伤显示白色数字向上浮动,治疗显示绿色向上。技术实现:8方向黑色描边(DamageNumberOutlineWidth = 0.025f 常量)+ 1个彩色主字,共9个TextMesh。通过 gameObject.CompareTag("Friend") 判断受击者阵营。已更新到《召唤之战-核心玩法.md》文档 2.3 章节。
- [2026-09-15 19:33:31] 金币系统已完成:GoldManager 单例管理,初始500金币,右上角UI实时更新。金矿建筑产出50金币/5秒,主角产出30金币/8秒。WorldHealthBar 的 currentEnergy 改为属性(带 setter 自动调用 UpdateEnergyFill),能量条尺寸从8像素增加到12像素(EnergyPixelHeight=12,EnergyPixelWidth=100)。能量条显示金币产出进度,满了产出并重置。已更新核心玩法文档。
- [2026-09-16 14:22:13] 2026-09-16 玩法定稿为"召唤师对决"并已写入《召唤之战-核心玩法.md》:无基地/金矿/兵营/防御塔,玩家手动点地操控召唤师(移动不攻击、站定攻击),限己方半场(三分屏:己方/交战/敌方区),能量直购出兵(单位在召唤师身边生成),击杀敌方召唤师获胜,超时毒圈收缩并解除半场限制,中期混沌裂缝事件,召唤师技能 3~4 种,摇杆留作实测后升级项。**Why:** 用户多轮迭代后的最终方向,旧"建筑生产+自动作战"对攻玩法封存不删。**How to apply:** 新战斗开发一律基于召唤师对决方案;不要在新玩法场景引入金矿/兵营/建筑摆放;BuildingPlacementManager/Barracks/GoldMine 等封存留作后续建筑卡或 PVE 特殊关素材。
- [2026-09-16 14:48:52] 召唤师对决首版场景已完成(SummonerDuelTest.unity,2026-09-16):新场景地面20×80、固定正交相机43°/orthoSize28、召唤师z=0(敌方z=35)均避开底部UI;新增 SummonerClickMovement(点地走位+clamp X[-9,9] Z[-19,6],移动中关攻击、到点恢复)、SummonerDuelManager(点卡片按能量直召,单位在召唤师身边生成)、UnitBase 新增 summonerMode 开关(不追击、站定攻击,默认关闭不影响旧单位);战斗界面UI从 CoreBattleTest 整树搬运复用,SummonCardButton 增加对决模式分支(无布阵/金币管理器时走能量直召+冷却)。主角已存为 Assets/Prefabs/主角/召唤师主角.prefab。**How to apply:** 后续对决玩法迭代(毒圈/胜负判定/召唤师技能)基于该场景与脚本扩展;Play Mode 验证等用户手动执行。
- [2026-09-17 09:33:46] 阵营 ID 系统已实现(替代 Unity Tag 判断敌我):UnitTeam 组件标记 teamId,GameManager.LocalPlayerTeamId 标识本地玩家阵营,支持 PVP(真人 vs 真人 / 真人 vs 机器人)。**Why:** PVP 需要动态敌我判断,Tag 系统无法支持(双方客户端看到的 tag 矛盾)。**How to apply:** 所有敌我判断改用 UnitTeam.IsEnemy(),血条颜色用 IsLocalPlayerTeam(),新生成单位必须设置 teamId(Barracks/BattleSetupManager 已修改)。
- [2026-09-17 09:33:58] 召唤师组件精简:移除了 NavMeshAgent、UnitBase、StatusEffectController,保留 MainCharacterCombat(战斗)+ SummonerClickMovement(移动)+ WorldHealthBar(血条)。SummonerClickMovement 已改为依赖 MainCharacterCombat 而非 UnitBase。**Why:** 召唤师是特殊单位,不应使用通用 UnitBase 逻辑;直线移动不需要 NavMesh。**How to apply:** 召唤师专属逻辑用 MainCharacterCombat,普通单位用 UnitBase。
- [2026-09-17 09:34:13] 《召唤之战》场地规格:60×20(Z×X),三区划分各 20 单位 - 己方区 z∈[-30,-10](召唤师 z=-20),交战区 z∈[-10,10],敌方区 z∈[10,30](敌方召唤师 z=+20)。召唤师移动限制在己方区内(SummonerClickMovement clamp Z[-29,-11])。相机 orthoSize=22,位置(0,40,-40),角度 43°。**Why:** 竖屏竞技场设计,双方对称 40 单位间距,防风筝规则(召唤师不能进入交战区)。**How to apply:** 所有位置/spawn 相关代码使用新的 Z 坐标范围。
- [2026-09-17 10:06:48] Projectile 伤害判定逻辑:HitTarget() 检查 UnitBase(普通单位)、BuildingHealth(建筑)、WorldHealthBar(召唤师等特殊单位)三种受击组件。召唤师使用 MainCharacterCombat + WorldHealthBar,不挂 UnitBase。**Why:** 召唤师是玩家控制的特殊单位,行为逻辑与普通 AI 单位不同。**How to apply:** 新增特殊单位必须有 WorldHealthBar 或 UnitBase 之一才能被攻击;法术球击中后调用对应组件的受伤方法(UnitBase.ReceiveDamage / WorldHealthBar.TakeDamage)。
- [2026-09-17 10:38:49] 召唤师(MainCharacterCombat)与普通单位(UnitBase)的架构差异:召唤师使用 MainCharacterCombat + WorldHealthBar + StatusEffectController,不挂 UnitBase。**Why:** 召唤师是玩家控制的特殊单位,行为逻辑与 AI 单位不同。**How to apply:** 涉及单位的通用系统(伤害、眩晕、范围效果)必须同时支持 UnitBase 和非 UnitBase 路径。已修复:Projectile.HitTarget()、UnitBase.ApplyDirectDamage()、UnitBase.ApplyAreaStun() 均添加了 WorldHealthBar / StatusEffectController 的检测分支。
- [2026-09-17 16:52:28] 已于2026-09-17新建分支转向拆家版玩法(以《召唤之战 - 核心玩法拆家版.md》V1.1为准),旧《召唤之战-核心玩法.md》召唤师对决文档作废。拆家版无主角:只做“选目标+点卡出兵”,单位从己方城堡出生并永久绑定目标。Why: 原地图太小导致打据点的兵被中路兵吸引成大混战。场景现状(按参考图十字布局定稿):CoreBattleTest平台40x70(Z 0~70),我方城堡Z=8/敌方城堡Z=62,纵向通道宽10(X±5)、横向通道高8(Z 31~39),四角用4块障碍物Cube封锁(14x2x31,材质ObstacleBlock.mat,后续可换岩石/树林模型),中央圆柱已删;水晶矿(-14,1,35)/随机出兵点(14,1,35)为金矿模型占位(scale2),相机正交(55°, size36, pos(0,70,-14)),NavMesh已重烘;主角/GoldManager/GoldUI/BuildingPlacementManager已删。后续按拆家版开发:目标按钮UI→出生目标绑定→红蓝进度条据点系统。
- [2026-09-18 17:17:04] 拆家版地图路线为"四边菱形外环 + 中央十字路网":我方主基地、水晶矿、敌方主基地、随机出兵点四点构成菱形,中央交叉区向四个顶点各连一条快捷路。Why: 用户希望主基地到资源点有直达路线并体现分路玩法。**How to apply:** 后续地图贴图、障碍物摆放和寻路区域设计必须同时保留四条外环边线和四条中心连接线,不能退化成单一十字或平行多路。
- [2026-09-18 17:17:26] 主基地采用"一套共用模型 + 独立阵营视觉部件"方案:城堡主体、出兵门、炮台结构红蓝共用,仅中央核心、出兵门能量膜、炮台能量和徽记按 teamId 切换材质颜色。Why: 避免两套模型比例/挂点不一致并减少维护成本。**How to apply:** 后续制作或替换主基地资产时保持共用结构,阵营区分只走 TeamVisual 子节点材质。
- [2026-09-18 22:37:49] 水晶矿血条/光球方案(2026-09-18 定稿):争夺血条 Canvas 在运行时创建于场景根(不挂水晶矿子级,规避 100 倍根缩放),血条高度由所有子 Renderer 世界包围盒顶部自动计算 + heightOffset 余量。AdjustableGlowOrb 同时控制主体球(_Color/_EmissionColor)和 GlowHalo 子渲染器(Legacy Additive 用 _TintColor + haloAlpha≈0.25)。CrystalMineCapture 新增 autoSetNeutralTeam 开关(拆家版设为 false,避免单位自动锁敌水晶矿);新增可选 riftVisual 字段同步裂缝颜色。随机出兵点也复用 CrystalMineCapture + RiftPortalVisual + BoxCollider。
- [2026-09-18 20:13:29] 随机出兵点(拆家版)已复用水晶矿争夺系统:根节点挂 CrystalMineCapture(新增可选 riftVisual 字段)+ BoxCollider(8.3×6.5×8.3,按世界包围盒/100 配局部值,供飞行物命中),UnitTeam 在 Awake 自动补 teamId=2 中立。裂缝视觉 RiftPortalVisual 随争夺进度白/红/蓝变色(CrystalMineCapture.RefreshVisuals 同步驱动)。注意:PortalEnergyVisual(UV 滚动动画)已从随机出兵点能量膜移除但脚本保留——城堡出兵门能量膜仍在用它,勿删脚本;两个 [ExecuteAlways] 视觉脚本不要同时挂同一 Renderer(会互抢 MPB)。
- [2026-09-19 09:52:40] 拆家版寻敌系统(2026-09-18):UnitBase.FindNearestOpponent() 改为两阶段——Phase1 在 detectionRange(默认25m)内搜索敌方战斗单位(跳过 Building Tag),Phase2 无敌方单位时搜索有 UnitTeam 的敌方建筑物(不限距离)。四个建筑统一挂 "Building" Tag:蓝/红城堡有 UnitTeam(teamId 0/1)+ BoxCollider,水晶矿/随机出兵点无 UnitTeam(中立不被自动锁敌)。旧 detectRange 字段已删除,替换为 detectionRange。NavMeshSurface 烘焙体积曾只覆盖 Z<40 导致红堡不可达,已扩为 center=(0,0,36.7) size=(50,10,70)。
- [2026-09-18 22:37:49] 拆家版出兵系统(2026-09-18):CastleSpawnManager 单例管理从城堡出兵,SummonCardButton.OnClick/CanAfford 优先走 CastleSpawnManager(在 SummonerDuelManager 之前)。出兵点是城堡子对象(localPosition 需除以100补偿缩放),带绿色 Marker 球体需注意局部缩放反算。ManaSystem 能量系统直接复用。场景 CoreBattleTest 中无 SummonerDuelManager/MainCharacterCombat。
- [2026-09-19 09:52:40] 拆家版建筑攻击修复(2026-09-18):单位不攻击建筑的根因是城堡无碰撞体+中心点距离永远超出判定。修复:IsWithinAttackReach 对 Building tag 目标用 Collider.ClosestPoint 计算到建筑表面的水平距离(不用半径扣减,会误判隔空攻击),攻击缓冲从 1.5 调到 0.2(用户要求贴近)。两座城堡已加 BoxCollider(编辑态保存,世界尺寸约12x12,局部值=世界值/100)。注意:用户移动建筑时碰撞体/序列化字段可能丢失,出问题先查碰撞体是否存在。
- [2026-09-19 19:15:25] 拆家版双阵营攻击标志系统(2026-09-19 定稿含"出生即使命"):AttackTargetController 维护 blueTarget/redTarget 独立标志(各默认敌方主城堡,名字+LocalPlayerTeamId 反推,0.5s缓存重查)。点击建筑只切本地玩家阵营标志(点己方主城无效);双箭头并排显示(同建筑±1.1错开),颜色=标志所属阵营。单位使命快照:UnitBase.Start() 时 missionTarget = GetTeamTarget(teamId) 一次性快照,之后标志变化不影响场上单位(支持分兵);FindTarget() = Phase1 detectionRange内敌方单位 → Phase2 missionTarget(销毁时兜底敌方主城);到达使命建筑是己方阵营→该单位 missionTarget 改为敌方主城(不碰全局标志)。水晶矿/混沌之门根节点 CapsuleCollider(4.2/3.6米半径)。GetTeamTarget 仅供出生快照用,ResetTeamTargetToMainCastle 已删。
- [2026-09-19 20:59:31] UnitBase 根运动架构(2026-09-19 定稿):applyRootMotion 全局 true,OnAnimatorMove() 统一协调——走路(agent 开):只叠加动画侧向摇摆(垂直朝向分量)+ root 转身差量,前向分量丢弃防双倍速,transform 变更后同步 navAgent.nextPosition;攻击/技能(agent 已禁用):根运动全量位移(前冲/后撤,垂直分量丢弃防漂离地面)+ 转身。死代码已删:CC 移动分支/applyGravity/getVerticalVelocity/ComputeSeparation/GetHorizontalCollisionRadius/randomTargetPos/range/gravity/useRootMotion/separationRadius/separationWeight/targetPos/startPos/controller 字段——所有单位统一 NavMeshAgent 寻路(CharacterController 从架构移除,但保留单位 Prefab 上的 CC 组件用于受击碰撞检测?不——CC 已不 disable 也不 enable,Projectile 靠它命中)。场景蓝色怪物实例已修:删 CC 加 NavMeshAgent,Y 归位 0.16。走路摇摆是烘焙在根骨骼上的动画,root motion 关闭时身体锁死只剩脚动("脚扭腰不动"现象)。
- [2026-09-19 19:48:47] 拆家版NavMesh平坦化(2026-09-19):建筑模型网格被烘进NavMesh形成≤45°斜坡导致单位被抬上建筑(Y到2.15)。修复:创建Buildings层(layer 8),四个建筑(两城堡/水晶矿/混沌之门)整棵层级改入该层,NavMeshSurface layerMask排除Buildings(-257)后重烘→NavMesh恒定平坦Y=0.16。另在场景根级创建4个空物体"XX-寻路障碍"挂NavMeshObstacle(carving=true需显式设置,capsule半径=建筑CapsuleCollider世界半径)运行时挖空建筑足迹防单位穿模。障碍物体放场景根级而非建筑子级,避免100倍缩放歧义。平台顶面y=0.09,NavMesh烘焙时注意平台移动后必须重烘。
- [2026-09-19 22:17:52] 单位贴地方案调整:`UnitBase` 不再根据 Renderer 包围盒最低点自动计算或延迟重设 `NavMeshAgent.baseOffset`,统一固定为 0,避免模型原点与脚底偏移被误当作寻路高度导致角色运行时整体抬升。
- [2026-09-19 22:38:39] 2026-09-19 拆家版规则更新:水晶矿占领后按固定间隔为归属方增加1点能量,不改变基础能量回复速度;混沌之门自动产兵按当前出战卡组概率抽取,低费用卡高概率、高费用卡低概率。设计文档已同步,具体间隔和概率留待战斗测试。
- [2026-09-20 13:36:59] 2026-09-20 三路测试布局已在 CoreBattleTest.scene 临时搭建:蓝堡/红堡居中,水晶矿 X=-10、混沌之门 X=10、Z=35;两条临时长方体屏障位于 X=-5 和 X=5,均带 BoxCollider 与 NavMeshObstacle carving,形成左/中/右三条路。
- [2026-09-20 20:44:52] 2026-09-20 固定卡组与轮转已接入 CoreBattleTest:8卡组为人类士兵、弓箭手、盾卫、精锐士兵、法师、狂暴狼人、石巨人、弓箭猎人;底部显示4槽,出牌成功后当前卡进入队尾并由队列补下一张。BattleDeckCycle 挂在 CastleSpawnManager。当前弓箭猎人、狂暴狼人、石巨人的 CharacterData.unitPrefab 仍为空,暂不能正常出兵。
- [2026-09-20 21:43:39] 2026-09-20 卡牌故障修复:8卡组中的弓箭猎人、狂暴狼人、石巨人已分别绑定第二章对应 Prefab,轮转不会再因 unitPrefab 为空而卡死;CastleMageSkill、ArcherSkill、ArcherHunterSkill 和 UnitBase 已移除废弃的 GetOpponentTag/OpponentTag,统一使用 UnitTeam 阵营判断。
- [2026-09-21 11:10:20] 2026-09-21 UnitBase 目标锁定规则已更新:单位只有在没有有效目标时才寻敌;锁定后移动和攻击期间保持当前目标,新敌人不打断;当前目标死亡、失活或攻击状态下离开攻击范围时才解除锁定,下一帧重新寻敌。单位与建筑目标统一使用同一规则,并通过 WorldHealthBar.IsDead 判断死亡。
- [2026-09-21 11:16:19] 2026-09-21 UnitBase 目标锁定规则修正:攻击状态一旦进入就不再寻敌,保持当前目标,避免多个单位奔向同一建筑时擦肩后切换目标。仅当当前目标死亡/失活,或因技能等原因不再满足攻击距离时才退出攻击状态;退出后才重新寻敌。单位和建筑目标统一使用同一规则。
- [2026-09-21 14:26:28] 2026-09-21 据点目标规则修复:CrystalMineCapture 占领后会实时把 UnitTeam.teamId 改为蓝方/红方/中立;UnitBase.IsTargetValid 必须同时检查目标存活状态和目标是否仍属于敌方。出生使命建筑若已被己方占领或变为中立,应立即失效并回退攻击敌方主城堡。
- [2026-09-22 10:58:17] 2026-09-21 远程弹道视觉方案调整建议:普通远程弹道继续使用 Projectile.cs 处理锁敌、飞行、碰撞和伤害;火球等圆形视觉优先使用 SpriteRenderer 始终朝向摄像机,不强制使用 Quad,以避免贴图方向难调。若有明显尾焰,再拆分核心 billboard 与按飞行方向旋转的尾焰层。
- [2026-09-22 13:39:47] 2026-09-22 投射物斜向问题修复:UnitBase 发射普通攻击和技能投射物时,不再把骨骼下 attackPos.rotation 传给 Projectile 根节点,统一使用 Quaternion.identity;attackPos 只负责提供生成位置。原因是法师/弓箭手的 attackPos 挂在手骨骼下,会继承动画旋转导致火球和箭矢斜着出现。
- [2026-09-23 22:13:21] 2026-09-23 角色黑色描边系统:Outline_Black.mat(Assets/Shader/Outline.shader,反向外扩 + Cull Front)以 SkinnedMeshRenderer 的 materials[1] 挂在全部 10 个角色 Prefab(人类士兵/弓箭手/法师/盾卫/精锐士兵/弓箭猎人/狼人/石巨人/蓝色怪物/召唤师主角),武器(短剑/盾牌/大剑/弓)不加描边。关键坑:_OutlineWidth 是物体空间数值,会被物体缩放放大,所以网格局部尺寸很小的模型描边会巨大化——蓝色怪物网格局部尺寸仅 0.02(被缩放约 160x),已改用专用材质 Outline_Black_小比例.mat(_OutlineWidth=0.0002)。零厚度平面(盾牌/大剑/弓)无法用反向外扩描边,会整块变黑或不可见,这是武器不描边的原因。已实测描边能跟随骨骼动画姿势。Why: 后续新增或替换角色模型时若局部缩放与 1 相差较大,必须同步调整描边宽度,否则整个模型会被黑色吞没。
- [2026-09-24 21:47:12] 2026-09-24 玩法定稿转向「塔防版」并取代拆家版主线:己方半场网格部署固定5个英雄(近战前/远程后),敌人从上方按波次进攻,英雄会走位自动交战(复用UnitBase,需加"格位锚点+追击上限leash"否则会一路推出去被逐个点掉);玩家战斗内只有两个操作——手动全屏技能 + 3选1增益卡(不拖拽、不补兵);场上5英雄同时全灭即判负(无基地/核心),英雄死亡20秒复活、每局2次看广告立即复活。卡牌稀有度 蓝<紫<橙<酒红(传奇),稀有度只加机制复杂度不加数值;主线固定难度卡点,刷碎片/金币可自由调难度;名义PVP本地段位有效;疲劳系统确定要做(范围/数值待细化,建议只作用于无尽模式+收益衰减而非硬锁)。Why: 用户多轮迭代后确定,此前拆家版/召唤师对决均已封存。How: 新战斗基于塔防版开发;拆家版存档分支、其设计文档作废;Phase1 只做战斗垂直切片不碰元成长。
- [2026-09-24 22:14:10] 2026-09-24 UnitBase 寻敌逻辑按塔防版简化:删除全部"找建筑"逻辑(missionTarget 字段、Start() 里 AttackTargetController 使命快照、FindTarget() 的 Phase2 建筑分支、IsFriendlyBuilding()、FindNearestEnemyUnit() 里跳过 Building Tag 的判断)。现在 FindTarget() 只返回 detectionRange 内的最近敌方战斗单位,范围内没敌人就原地待机(Alert)。9 个角色 Prefab 的 detectionRange 从 8 统一改为 30(代码默认值也改为 30,但 Prefab 上是序列化值,改默认值不生效)。Why: 塔防版没有建筑,保留拆家版建筑兜底会让单位在找不到敌人时无处可去而发呆;detectionRange 只有 8 导致单位几乎不主动接敌。How: 后续若恢复建筑/据点玩法需重新引入目标快照;注意 CoreBattleTest(拆家版)的城堡不再被单位自动锁定。另修复一个坑:UnitBase 里用 transform.root 比较来跳过"自己/自己的子物体"的写法不可靠——塔防版把英雄和敌人放进同一个场景容器(战场)下会让两者 root 相同,导致 FindNearestEnemyUnit/ApplyAreaSkillDamage/ApplyAreaStun 把全部敌人误判成自己而跳过(表现为单位完全不寻敌)。已改为 IsOwnHierarchy()(IsChildOf 双向判断)。
- [2026-09-25 11:47:00] 2026-09-25 微信小游戏构建修复:移除 com.unity.feature.mobile 等包会导致 com.unity.dt.app-ui@1.1.0 编译失败(mousePosition/mouseLeftButtonDown 未定义),从而 SDK 清空 /Users/huadexuan/WeChatProjects/daluandou 后留下空目录;这些包需保留。恢复后转换成功。当前有效构建输出为 /Users/huadexuan/WeChatProjects/daluandou,minigame 约6.7MB,webgl CDN资源约64MB。
- [2026-09-25 13:48:45] 2026-09-25 塔防版 UnitBase 已加入可选锚点/追击上限:useAnchorLeash 默认关闭,DefenseTest 的 BattleFormationSpawner 为生成英雄开启;默认 anchorLeashDistance=7m、anchorArriveDistance=0.35m。英雄生成时记录出生格位,无目标时返回锚点,超出追击距离时放弃目标并返回。已编辑态编译通过,Play Mode 尚未自动验证。
- [2026-09-25 23:43:37] 2026-09-26 已创建 Assets/Animation/base-Minions.controller:从 base-人类士兵.controller 复制,保留 speed、attack 参数和待机/移动/攻击状态,删除 skill 参数与 skill 状态。当前小兵控制器暂时复用人类士兵的三个动画,后续只需替换各状态 Motion;原英雄控制器未修改。
- [2026-09-26 12:08:02] 2026-09-26 城堡蓝卫已在 DefenseTest.scene 初始化完成:挂载 Animator、UnitBase、UnitTeam、WorldHealthBar、NavMeshAgent、CapsuleCollider;Tag=Enemy、teamId=1、生命170、攻击22、速度3.5、检测范围30、攻击范围1.5;使用 Assets/Animation/base-Minions.controller;无 UnitSkill、无技能能量条,仅显示血条;编辑态编译通过。
- [2026-09-26 19:53:13] 2026-09-26 DefenseTest 波次模拟已整理:删除场景遗留的敌人_狼人_1/2/3和旧 WaveSpawner,保留一个自动开始的第一关波次控制器;Level1-Waves.json 配置3波,使用城堡蓝卫Q和蓝角蛮卒,波次间有等待时间和生成间隔,运行时创建顶部波次进度条。修复进度条字体为 LegacyRuntime.ttf。
- [2026-09-26 19:59:00] 2026-09-26 用户反馈第一关波次问题待修:敌人生成位置过靠前,需要移到摄像机视野外再走入;己方英雄击杀目标后会原地待机而不回初始位置,并偶发无播放移动动画却发生平移,疑似 UnitBase 状态切换/NavMeshAgent 与 root motion 协调问题。
- [2026-09-26 23:03:24] 2026-09-26 弓箭手走路动画变慢修复:Assets/Prefabs/第一章/弓箭手.prefab 的 Animator applyRootMotion 已对齐为 true;UnitBase.FinishAttack() 改为攻击结束强制 animator.speed=1,避免攻击动画按 attackDuration 调速后污染走路动画;StatusEffectController 眩晕结束恢复 UnitBase.AttackSpeedMultiplier 或无 UnitBase 时恢复1。编辑态编译通过,尚未自动进入 Play Mode 验证。
- [2026-09-26 23:25:29] 2026-09-26 角色生成统一规则:波次小怪采用简洁Q版低模模型,与玩家收集型英雄区分;必须严格正面/A-Pose、头部独立于躯干且保留短脖子、头/躯干/双臂/双腿/双脚彼此分离、关节清晰以便Mixamo绑定;角色图片不生成武器,武器由Unity单独挂载;角色使用主体色+少量识别色并保持清晰辨识度,地面和背景低饱和低对比度。玩家可收集卡牌角色沿用同一套结构约束(正面/A-Pose、独立头颈、分离四肢、无内置武器、角色与环境有辨识度),但使用正常/英雄比例,不采用Q版比例。
- [2026-10-02 10:02:58] 塔防版角色基础数值:第一章英雄为人类士兵300/42、弓箭手220/55、盾卫700/30、法师240/100、精锐士兵520/78;小兵为城堡蓝卫170/22、城堡弓童150/28、城堡金盾卫360/36。城堡蓝卫的 CharacterData 资源名为 `城堡蓝卫Data`,Prefab 的 `characterDataName` 必须与之完全一致。
- [2026-09-27 15:24:49] 2026-09-27 战斗平衡规则补充:角色命中获得的技能能量/技能点应按各自技能强度单独平衡,不应统一设置;第一版可先用近似基准值跑通玩法,后续专门再平衡。用户倾向卡牌英雄初始普攻速度彼此接近(类似 MOBA 英雄起始攻速),英雄差异主要由技能机制及其充能效率体现。
- [2026-09-29 17:03:15] 英雄死亡复活系统已完成:友方英雄 WorldHealthBar.canRevive=true 防止销毁,HeroCardUI 显示20秒倒计时和广告复活按钮(2次/局),复活后满血回到出生位置
- [2026-09-29 17:03:15] 召唤师技能系统已完成:技能1群体治疗(CD 20秒,回血100),技能2全屏AOE(CD 20秒,伤害80),UI显示冷却倒计时
- [2026-09-29 17:03:15] 波次系统已扩展到10波,难度曲线:前3波热身,4-7波混合,8-10波精英,波次间隔5-10秒递增
- [2026-09-29 17:03:15] 全局攻击力已降低40%(×0.6),战斗时间延长约1.6倍,平衡游戏节奏
- [2026-09-29 23:09:39] 大乱斗项目网格部署位置:BackZ=-15.0f,ColStep=2.4f,RowStep=2.8f,网格Z范围-15到-3.8,X范围-6到+6,6列5行正方形格子,与摄像机(0,30,-33)45度角正交视图size=16配置统一
- [2026-09-29 23:09:21] 阵型保存功能:FormationManager.StartBattle()保存阵型到PlayerData.json(不跳转场景),BattleFormationSpawner优先从PlayerData.json加载阵型数据,使用characterId和cellIndices数组
- [2026-09-29 23:09:29] 敌人寻敌距离:所有敌人生成脚本(WaveSpawner、DefenseWaveLevelController、EnemyCastleAI、CastleSpawnManager)在生成敌人后设置detectionRange=100f,友方英雄保持默认30f
- [2026-10-01 15:45:40] Projectile脚本支持可选爆炸效果:添加了public GameObject explosionPrefab字段,命中时如果不为null则在碰撞位置生成爆炸特效
- [2026-10-01 15:45:51] PlayerDataManager需要设置localPlayerJson引用到Resources/PlayerData.json才能正确读取保存的数据,已在FormationTest和DefenseTest场景中配置
- [2026-10-01 22:56:36] 2026-10-01 GUID灾难修复:脚本移动时漏带.cs.meta导致全项目引用断裂。修复方法——用 AssetDatabase.FindAssets 取回Unity认可的真实GUID(注意.meta文件里团结引擎存的是加密串,不可直接用),再sed批量替换asset中的旧GUID;Prefab/场景则用 GameObjectUtility.RemoveMonoBehavioursWithMissingScript 清理后按规则重新 AddComponent。
- [2026-10-01 22:56:51] 塔防版角色攻击参数基准(2026-10-01 重建后设定):近战英雄 attackRange=1,小怪/石巨人=1.5,远程(弓箭手/法师/城堡弓童/弓箭猎人)=6 且 attackType=RangedProjectile;全体 detectionRange=30。远程发射点统一为根节点下独立空物体 AttackPos,localPosition=(0,1.2,0.5),不挂骨骼以免继承动画旋转。
- [2026-10-01 22:57:06] UnitBase.IsWithinAttackReach 攻击缓冲:基础 buffer=0.2,攻击状态下再 +0.5 防状态抖动(UnitBase.cs 约530行)。buffer 过大会造成"隔空对打"——1.5 时近战实际在2.5米外就开打。
- [2026-10-01 22:57:19] DefenseWaveLevelController 生成小怪时必须显式设置 UnitTeam.teamId=1(仅设 tag="Enemy" 不够),否则 Prefab 上默认 teamId=0 会让小怪被当成友军,双方都不交战。场景中该组件的 enemyPrefabs 列表需配 4 项:castle_blue_guard_q/castle_archer/castle_gold_guard/蓝角蛮卒。
- [2026-10-02 00:03:51] Stone Golem stun VFX prefab path: Assets/Prefabs/特效/眩晕头顶星星/眩晕星星粒子.prefab — already exists, should be referenced in Stone Golem prefab Inspector for ApplyAreaStun to work
- [2026-10-02 15:21:34] 2026-10-02 DefenseTest 人类士兵不移动的根因是 UnitBase 技能状态可能因 Animator 状态名不匹配而永久停在 State.Skill,导致 target=null、NavMeshAgent 无路径。UnitBase.PlaySkillAnimation/CheckSkillAnimationFinished 已加入技能超时兜底:动画正常结束或超过技能时长+缓冲都会恢复 Alert、清理回调并恢复 Animator 速度。
- [2026-10-03 12:29:08] 2026-10-03 卡牌稀有度系统:CharacterData 有 CharacterRarity(Blue/Orange/Purple/Red),HeroCardUI 通过 BattleFormationSpawner 绑定 CharacterData 后选择对应边框;DefenseTest 五张卡片各有 RarityFrame Image,四种边框 Sprite 已绑定到 HeroCardUI 字段,RectTransform 保持卡片尺寸、可由用户自行调整。初始资源设定:荒野之王 Red;法师、狂暴狼人、盾卫、石巨人、精锐士兵、荒野祭司 Purple;其余现有角色 Blue;Orange 暂未分配。
- [2026-10-03 23:38:14] DefenseTest场景已改造为开局布阵模式:玩家开局拖动英雄卡到3行6列后三排网格(BackZ=-15),点击开始战斗按钮后开始波次,每波结束英雄回到初始位置。不再预先配置阵容到JSON。已创建DefenseGameFlowController和GridLineVisualizer(红线可视化网格,Y=0.5)。StartBattleButton在BottomUI下。
- [2026-10-04 09:28:04] 2026-10-04 DefenseTest 开局卡牌拖动修复完成:根本原因是 BattleFormationSpawner 在 Start() 时自动生成英雄(法师/弓箭手),DefenseGameFlowController.InitializeCardDrag() 需要的 HeroRoster.asset 因损坏无法加载。修复方案:1) 重新创建 HeroRoster.asset 包含5个英雄并正确设置 unitPrefab 引用;2) 在场景中禁用 BattleFormationSpawner 组件,塔防版不需要自动生成初始英雄;3) DefenseGameFlowController.roster 字段在场景中配置 HeroRoster 引用。现在开局场上无单位,5张卡片均可拖动,HeroCardDrag 组件和 CanvasGroup 已自动配置。
- [2026-10-04 10:15:39] 2026-10-04 DefenseTest 布阵拖拽系统重做完成。DeployGrid 常量改为 6列×5行、ColStep=2.8、RowStep=3.0、BackZ=-9(旧值 -15 落在 NavMesh 之外,单位会卡住)。战场/部署网格 的30个格位由 DefenseGameFlowController.AlignGridCells 按命名「格位_行_列」自动摆到 DeployGrid 坐标,布阵阶段显示、开战隐藏。新增 DeployHighlight(绿=可放/红=已占用,公开 IsVisible/IsBlocked/ShownCell),HeroCardDrag 重写为「生成半透明英雄幽灵跟随指针 + 平面射线吸附格位」,DefenseGameFlowController 增加 Instance/IsDeployPhase/PlaceHeroFromCard/IsCellOccupied/IsCardPlaced/RemoveHeroAt,点击已放置英雄可撤回(Update 里 Physics.Raycast 命中 UnitBase)。场景新增 StartBattleButton(Canvas 根、bottom-center、y=360、圆角绿底),deploymentUI 必须保持 null——英雄卡面板战斗中要一直显示血量/复活。血条隐藏要操作 WorldHealthBar.Awake 生成的子物体 "WorldHealthBar",不是组件所在的对象。
- [2026-10-04 11:15:47] 2026-10-04 DefenseTest 布阵区域改为 4×4 并与用户新建的 Plane 完全重合。DeployGrid 常量:Cols=4、Rows=4、ColStep=2.875、RowStep=2.8、BackZ=-14.2、CellWidth=2.815、CellDepth=2.74、GridY=0.115、UnitY=0.10(对齐重烘后的 NavMesh)。Plane 原在 y=0.5 会挡住单位,已降到 y=0.09 并放入 Buildings 层(layer 8)排除烘焙;NavMeshSurface 体积改为 center=(0,1,12) size=(28,12,62) 重烘,NavMesh 高度由 0.16 变 0.095,DefenseWaveLevelController.spawnY 同步改为 0.1。开始游戏按钮改为顶部居中(anchor 上中、anchoredPosition y=-170、420×120)。注意:BattlePlatform 实际只覆盖 Z -22.8..17.2,所以 NavMesh 远端也就到 ~16.9,敌人 spawnZ=20 本身在地面之外(靠 NavMeshAgent 自动吸附),这是既有行为。
- [2026-10-04 13:12:11] 2026-10-04 英雄打完归位改为"走回去"(正常速度),去掉瞬移。关键坑:UnitBase.Start 里 `navAgent.stoppingDistance = attackRange*0.95` 会让 agent 在到达锚点前就认为"已到达"而停住(法师 5.7 米、盾卫 0.95 米都远大于 anchorArrivalDistance 0.35),所以"走回锚点"以前根本走不到——这正是当初只能瞬移的原因。修法:ReturnToAnchor 里把 stoppingDistance 设 0,RestoreIdleSpeed/move() 里恢复 NormalStoppingDistance。另新增 useAnchorLeash/anchorLeashDistance(英雄设为 10 米,DefenseGameFlowController.heroLeashDistance 控制),目标距锚点超过上限就不追,避免一路推到 Z≈16。DefenseGameFlowController.ResetHeroPositions 现在只清 target 让 UnitBase 自己走回,仅当 NavMesh.SamplePosition 找不到落脚点(真卡住)才瞬移兜底。
- [2026-10-04 14:12:16] 2026-10-04 DefenseTest 两处修正:1) 阵位守护距离不再单开字段,直接用 UnitBase.detectionRange(已删除 anchorLeashDistance / heroLeashDistance;DefenseGameFlowController 只留开关 heroGuardPost=true,新 bool 字段在旧场景里会反序列化成 false,必须显式写进场景)。出战 5 个英雄 Prefab 的 detectionRange 已从 30/50 调到 10(弓箭手 12)。2) 底部英雄卡的角色改回从 PlayerData.json 的 currentDeck 读(站位不再读),卡面(头像/名字/稀有度)用同一份 CharacterData 刷新(新增 HeroCardUI.SetCharacterInfo,区别于绑定单位的 SetHero),否则会出现「卡面显示人类士兵、拖出来却是法师」的不一致;PlayerData 读不到时兜底用 HeroRoster。注意 CharacterData 里有些角色(荒野之王/荒野流寇等)unitPrefab 为空,不能出战,取阵容时要跳过。
- [2026-10-04 23:19:03] - [2026-10-04 22:20:00] CharacterData 真实字段名(猜错会导致 exec_editor_script 编译失败):baseMaxHealth / baseAttackPower / baseMoveSpeed / healthPerLevel / attackPerLevel / moveSpeedPerLevel / characterId / characterName / cardIcon / rarity / unitPrefab / description。**不存在** baseHealth / baseAttack。UnitBase 的“角色数据”字段是字符串 characterDataName,运行时 Resources.Load<CharacterData>($"Data/{name}"),资产放在 Assets/Resources/Data。
- [2026-10-04 23:19:03] - [2026-10-04 22:20:00] 批量改 prefab 上 UnitBase.characterDataName 的坑:AssetDatabase.FindAssets("名称 t:Prefab") 是模糊匹配(搜“盾卫”会命中“城堡金盾卫”),曾把城堡金盾卫误填成 盾卫Data(HP 700 顶替了 300)。**How to apply:** 批量改 prefab 字段必须用精确路径 AssetDatabase.LoadAssetAtPath<GameObject>(完整路径) 逐个处理,改完立刻回读全量校验,不能只看“Updated N”日志。
- [2026-10-04 23:19:03] - [2026-10-04 22:20:00] 第一章/第二章 共 12 个角色 prefab 的 characterDataName 已补齐并验证可加载(数值取自 Resources/Data)。映射留意:狼人.prefab 对应的是 狂暴狼人Data(资产名与文件不一致)。**未完成项:** 蓝角蛮卒.prefab 填的 蓝角蛮卒Data 在 Resources/Data 下不存在,运行时会打黄色警告并回退 Inspector 默认值 —— 待用户提供 HP/ATK/SPD 等数值或指定复用来源后再新建该资产。
- [2026-10-04 23:19:03] - [2026-10-04 22:20:00] exec_editor_script 参数规则(当前 Codely bridge 版本):enable_repl=false 时**不能**传 script_session_id,否则报 “was provided but enable_repl is false” 校验失败且脚本完全不执行;空字符串也报错。需要多轮排查就用 enable_repl=true 并复用返回的 session_id。违反会连续重复同一失败调用进而触发 tool loop 检测。
- [2026-10-05 15:04:17] [2026-10-05] 英雄攻击或释放技能期间 UnitBase 会将 navAgent.enabled 设为 false。ResetHeroPositions 在波次结束让英雄回位时,需先将目标清空并重新启用 navAgent,避免将攻击中/技能中的英雄误判为寻路不可用而触发瞬移。
- [2026-10-05 22:42:24] [2026-10-05] 塔防版寻敌与出击规则:1) 英雄全屏索敌(detectionRange=100),战斗期间按波次出击,只有在整波敌人清空(HasAnyEnemyOnField=false)后才走回初始格位。2) 警戒线出击机制:用 engagementZThreshold (默认 Z<=10),敌人越过警戒线后团队全员出击。3) 计算近战攻击判定距离时扣除双方 NavMeshAgent 半径,避免体型大的单位因圆心距无法满足攻击判定而顶着敌人推送。
- [2026-10-05 23:10:50] [2026-10-05] 塔防版规则与UI扩展:1) 召唤师技能包含 8 个全屏/解场方案(神圣赞歌、天雷狂轰、陨石轰炸、绝对零度、斩杀风暴、庇护圣盾、虚弱诅咒、岩石傀儡),记录于《召唤之战-核心玩法塔防版.md》。2) 英雄在 1/3/6/10 级解锁技能机制,记录于《召唤之战-角色与技能说明.md》。3) WorldHealthBar 在血条左侧无缝嵌入圆形等级徽章 (LevelBadge),且 LookRotation 使用 (barRect.position - camera.transform.position) 防止 UI 镜像反转。
- [2026-10-06 18:49:58] 战斗内增益系统 12 个核心词条 + 2 个功能词条(攻击力/生命值/攻速/暴击/吸血/充能/召唤师CD与威力/射程/减伤/护盾/击杀金币/招财进宝/紧急救急)已在 BuffSelectionController.cs、UnitBase.cs、WorldHealthBar.cs、PlayerSkillSystem.cs 与 DefenseWaveLevelController.cs 完整接入。
- [2026-10-07 17:32:11] 召唤师技能治疗特效实现:使用 ParabolaFlyObject 驱动 GlowOrbGreen 飞球 (Assets/TJGeneratorLibEffects/Prefabs/Interactive/Loot/GlowOrb/GlowOrbGreen.prefab) 抛物线飞行至阵地中心,落地瞬间触发 2.5 倍缩放的 HealNova 粒子冲击波 (Assets/TJGeneratorLibEffects/Prefabs/Interactive/Healing/HealNova.prefab),并在此时调用 BuffSystem.Instance.ApplyGroupHeal 结算恢复。
- [2026-10-07 16:22:52] 法师技能与特效配置更新:法师 projectilePrefab 统一使用 FireballSharpMissileFire.prefab,并且命中落地触发 MagicExplosionFire.prefab 爆破,具体资产路径已同步更新至《召唤之战-角色与技能说明.md》。
- [2026-10-08 00:04:53] 天雷狂轰技能实现:点击释放时在全屏中心激发 NovaLightningBlue 蓝闪电光环,同时按 80ms 节奏交错向全场敌方单位头顶劈下 LightningExplosionBlue 落雷(无敌人时在阵地随机轰炸 6 道),造成最终结算伤害并弹出漂字。具体路径与配置已同步写入项目。
- [2026-10-08 16:33:27] 2026-10-08 敌方单位不共享 3 选 1 战斗增益卡,增益卡为玩家专属 Build 系统;关卡难度通过敌方英雄等级、星级和数量显式决定,不进行隐式数据调整。
- [2026-10-08 16:33:41] 2026-10-08 塔防版等级与成长规则:不设立账号/玩家等级,所有成长挂载在卡牌自身的卡牌等级(1~10级),消耗金币与卡牌碎片升级;在 1/3/6/10 级大节点解锁/强化技能机制。
- [2026-10-09 11:31:55] 2026-10-09 3 选 1 增益 D-Card 规则:刷新消耗固定 2 金币,3 个卡槽独立计算递进升阶概率(初升中 10%+10%/次,中升高 3%+5%/次,高升顶 1%+2%/次),刷出升阶重置该槽位追加概率;选卡后重置全槽位。UI 金色文本统一使用三阶渐变 Shader UI/GoldTextGradient 与暗色 Outline。
- [2026-10-09 16:22:12] 2026-10-09 护盾 UI 规则:独立顶层护盾条 (ShieldBar),护盾槽物理宽度按 maxShield/maxHealth 占血条比例显示并保留黑边框,受击时按 currentShield/maxShield 在黑框内向左平滑缩减。盾卫技能默认使用内置粒子特效 MagicShieldBlue.prefab。
- [2026-10-10 15:36:35] 2026-10-10 重新制作并上线新版蓝色怪物 Prefab (Assets/Prefabs/第二章/蓝色怪物.prefab),绑定蓝色怪物Data、蓝色怪物.overrideController、MagicShieldBlue 等组件,已更新全流程数据关联。
- [2026-10-10 23:10:06] TopBar 顶部视觉优化:Top 节点添加全屏宽 1080px、向下 260px 的渐变暗色遮罩 TopDarkVignette (Assets/Picture/UI/TopDarkGradient.png),使顶栏波次、金币文字与黄金分割线在浅色沙漠地面上保持高对比度与高级视觉沉降感。
- [2026-10-11 22:07:23] 2026-10-10 英雄技能阶梯解锁系统(1/3/6/10级)全面重构:全英雄彻底移除物理击退/跳跃位移,机制基于现有底层(眩晕Stun、护盾AddShield、嘲讽target重定向、流血/引燃持续伤害、击杀刷新/处决连斩、破盾反弹、减速);特效全部对标内置库(StunStars、MagicShieldBlue、FireballSharpMissileFire、MagicExplosionFire、SwordSlashThickWhite、SwordWaveWhite、ShockwaveRing等);各英雄1级亮核心、3级增幅、6级质变机制、10级大招高光。已同步写入《召唤之战-角色与技能说明.md》。
- [2026-10-11 22:44:10] 2026-10-11 盾卫技能实装完毕:ShieldGuardSkill.cs 接入 1/3/6/10 级阶梯体系。1级35%护盾(MagicShieldBlue)、3级50%护盾且延长至6s、6级OnSkillHit1事件帧拍地爆发NovaBlue声波环并强制嘲讽周围4米敌人3秒(UnitBase.ApplyTaunt)、10级霸体免控(StatusEffectController.isStunImmune)且破盾/超时爆发NovaLightningBlue反弹50%吸收量范围伤害(UnitBase.ApplyAreaSkillDamage)。CharacterTest场景与盾卫预制体已完成绑定与PlayMode验证。
- [2026-10-11 23:40:59] 2026-10-11 人类士兵技能实装完毕:HumanSoldierSkill.cs 接入 1/3/6/10 级阶梯体系。1级150%伤害配合SwordSlashThickWhite剑气、3级190%伤害且技能暴击率+20%、6级OnSkillHit1命中直接施加1.2秒断岳重击眩晕(ApplyStun+StunStars)、10级生命值首次跌破35%触发不屈战魂(AuraSoftBlue光环平铺地面,攻速+60%且普攻30%吸血持续6s)。已完成全流程PlayMode测试。Quad光环类地面特效实例化必须继承其Prefab自身X轴-90度(270度)旋转以保持平铺贴地。
- [2026-10-12 17:01:19] 2026-10-12 法师重构为阶梯技能体系 (CastleMageSkill.cs),包含 FireballSharpMissileFire 飞弹、MagicExplosionFire 爆破及 FireFieldRed 地面持续灼烧火海特效。
### Reference
- [2026-09-09 12:23:17] 飞行物脚本 Projectile.cs 负责锁敌追踪、碰撞检测和伤害结算。箭矢预制体 ArrowProjectile_White.prefab 已配置 Projectile 组件和 CapsuleCollider(Is Trigger)。远程单位需在攻击动画松弦帧添加 OnAttackEffect Event,并在 UnitBase 中设置 attackType=RangedProjectile、projectilePrefab、projectileSpawnPoint。