Skip to content

feat: Milestone 2 — 标签系统核心框架#2

Open
XiaoLinXiaoZhu wants to merge 4 commits intomasterfrom
feature/milestone-2-tag-system
Open

feat: Milestone 2 — 标签系统核心框架#2
XiaoLinXiaoZhu wants to merge 4 commits intomasterfrom
feature/milestone-2-tag-system

Conversation

@XiaoLinXiaoZhu
Copy link
Copy Markdown
Collaborator

Milestone 2:标签系统核心

概述

实现标签系统的完整核心框架,这是游戏一切行为的基础。标签系统采用事件驱动架构:物理层产生事件 → 事件总线分发 → 标签响应并产出效果。

架构设计

物理层 (Coin.cs)          事件层 (EventBus)         标签层 (ITagBehavior)
  翻转/静止/碰撞/掉落  →  GameEvents  →  标签订阅并响应
                                          ↓
                                    TagManager 管理生命周期

核心设计原则

  • 标签是纯 C# 对象(非 Godot Node),轻量且可测试
  • 标签之间不直接引用,通过事件和共享状态间接交互
  • 效果是数据,执行由管线负责(为 M3 结算系统做准备)
  • 深度计数器防止事件无限循环(最大深度 10)

新增内容

事件系统

  • EventBus: 类型安全的泛型事件总线(Subscribe/Publish)
  • GameEvents: 7 种核心事件(翻转、静止、碰撞、掉落、结算、回合结束、生成/移除)
  • GameServices: 全局服务定位器

标签框架

  • ITagBehavior: 标签行为接口(OnAttached/OnDetached)
  • TagManager: 标签管理器(固有标签 + 附着标签,品质槽位限制)
  • TagContext: 标签运行上下文
  • TagRegistry: 标签行为注册表
  • CoinQuality: 品质枚举(普通1/稀有2/传说3 槽)

10 个基础标签

标签 类型 效果
尸体 (corpse) 被动 面值归零
超重 (heavy) 被动 质量 ×10
脆弱 (fragile) OnFlip→OnLand 翻转后落地即消失
虚无 (void) RoundEnd 回合结束后消失
生物 (creature) OnHit 被砸死 → 移除生物 + 添加尸体
回归 (return) OnFallOff 掉出场地后传送回来
再弹跳 (bounce) OnLand 落地后再弹起一次
正面翻倍 (double_face) OnScore 正面 ×2,背面不拿分
磁力 (magnetic) OnLand 落地后吸引周围硬币
兔子 (rabbit) OnLand 落地后生成小兔子(数量=翻转次数)

数据驱动硬币定义

  • CoinDefinition: Resource 模板(面值、品质、大小、固有标签列表)
  • CoinFactory: 硬币工厂(加载场景 → 设置属性 → 附着标签)
  • 4 个 .tres 资源文件:铜币、小兔子、小兔子尸体、黑曜石

Coin.cs 集成

  • 集成 TagManager(_Ready 中初始化)
  • 碰撞检测(BodyEntered → CoinHitEvent)
  • 掉落检测(Y < -5 → CoinFellOffEvent)
  • GetEffectiveFaceValue(): 考虑尸体标签的面值查询

调试工具

  • DebugUI: 显示标签信息
  • DebugInputHandler: 快捷键生成特殊硬币(1-5)

验收测试建议

  1. 基础标签:按 1 生成小兔子,点击翻转,观察落地后是否消失(脆弱)
  2. 生物→尸体:生成小兔子,用其他硬币砸它,观察是否变为尸体(面值归零)
  3. 回归:按 3 生成回归币,翻转到场地外,观察是否传送回来
  4. 磁力:按 4 生成磁力币,翻转后观察是否吸引周围硬币
  5. 再弹跳:按 5 生成弹跳币,翻转后观察是否二次弹起
  6. 超重:按 2 生成黑曜石,观察质量变化(调试面板)
  7. 兔子生成:给硬币附着兔子标签后翻转,观察小兔子生成

新增:
- EventBus: 类型安全的事件总线,支持泛型订阅/发布,深度计数器防无限循环
- GameEvents: 核心游戏事件定义(翻转、静止、被砸、掉落、结算、回合结束等)
- ITagBehavior: 标签行为接口(OnAttached/OnDetached)
- TagManager: 标签管理器(固有标签 + 附着标签,品质槽位限制)
- TagContext: 标签运行上下文
- CoinQuality: 硬币品质枚举(普通/稀有/传说 → 1/2/3 槽)
- TagIds: 标签 ID 常量集中定义
- GameServices: 全局服务定位器

修改:
- Coin.cs: 集成 TagManager,添加事件桥接(翻转/静止/掉落事件发布)
- GameManager.cs: 初始化 GameServices
标签实现(按复杂度递增):
- CorpseTag(尸体):被动属性修饰,面值归零
- HeavyTag(超重):被动属性修饰,质量 ×10
- FragileTag(脆弱):翻转后落地即消失
- VoidTag(虚无):回合结束后消失
- CreatureTag(生物):被砸死后移除生物标签 + 添加尸体标签
- ReturnTag(回归):掉出场地后传送回最后有效位置
- BounceTag(再弹跳):落地后再弹起一次
- DoubleFaceTag(正面翻倍):正面 ×2,背面不拿分
- MagneticTag(磁力):落地后吸引周围硬币
- RabbitTag(兔子):落地后生成小兔子硬币(数量 = 翻转次数)

基础设施:
- TagRegistry: 标签行为注册表,根据 TagId 创建实例
- CoinDefinition: 数据驱动硬币模板 Resource(面值、品质、大小、固有标签)
- CoinFactory: 硬币工厂,根据定义生成硬币 + 附着固有标签
  - 内置小兔子硬币和黑曜石硬币的快捷创建方法
碰撞检测:
- Coin.cs: 连接 BodyEntered 信号,硬币间碰撞时发布 CoinHitEvent
  (碰撞力度阈值 0.5,避免静止接触误触发)
- 修复 CoinQuality 枚举值在 .tres 中的映射(0 → 1)

调试工具升级:
- DebugUI: 显示每个硬币的标签列表和有效面值
- DebugInputHandler: 添加标签测试快捷键
  1=小兔子 2=黑曜石 3=回归币 4=磁力币 5=弹跳币

硬币定义资源文件(.tres):
- bunny.tres: 小兔子(面值1, 极小, 虚无+脆弱+生物)
- bunny_corpse.tres: 小兔子尸体(面值1, 极小, 虚无+脆弱+尸体)
- obsidian.tres: 黑曜石(面值10, 虚无+超重)
- standard_copper.tres: 标准铜币(面值1, 无标签)
问题:
- ReturnTag 回归到 LastPosition(可能在场地边缘),导致重复掉落
- UpdateFallOffDetection 每帧检查,掉落后连续发布多个 CoinFellOffEvent

修复:
- ReturnTag: 回归位置改为场地中心 (0, 3, 0)
- Coin.cs: 添加 _hasFallenOff 防重复标记,0.5 秒后重置
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant