Skip to content

小结与练习

小结

本章核心概念:

  • BSN(Bevy Scene Notation)bsn! 宏提供的声明式场景描述,支持组件、子实体、观察者、资产引用
  • 场景组合:场景函数返回 impl Scene,通过包含其他场景实现复用,字段级 Patch 只覆盖需要改的值
  • 命名引用#Name 注册实体名并允许跨实体引用,bsn_list! 让多个根实体共享命名作用域
  • Template 系统Default + Clone 用于简单组件,FromTemplate 用于有 Handle<T>Entity 字段的组件
  • DynamicWorld:基于反射的序列化系统,DynamicWorld::from_world + serialize 输出 RON 文件,DynamicWorldRoot 从文件加载

关键流程:

  • 代码场景bsn! { ... }spawn_scene → 实体生成
  • 文件场景:构造 World → DynamicWorld::from_worldserialize → 写文件 → asset_server.loadDynamicWorldRoot → 实例化

练习

  1. 按钮工厂:写一个 button(label: &str) 场景函数,返回带 ButtonNodeBackgroundColor 和子实体 Text 的场景。用 bsn_list! 同时生成 3 个不同标签的按钮。

  2. Boss 变体:基于 Listing 32-3 的 enemy() 函数,写一个 elite_enemy() 函数,组合 enemy() 并覆盖 HealthDamage。再写一个 boss() 函数,组合 elite_enemy() 并附加子实体(小兵)。

  3. 跨实体引用:用 #NameEntityTemplate 实现一个"炮塔锁定目标"的场景:炮塔实体有一个 Target(Entity) 组件,引用同一 bsn! 作用域内的目标实体。

  4. 保存与热重载:在 Listing 32-6 的基础上,运行时手动编辑 assets/scenes/level.scn.ron(改一个 Health 值),观察控制台是否输出新的实体数据。提示:Bevy 的 AssetPlugin 默认启用文件监听。