Skip to content

小结与练习

本章要点

  • #[derive(Reflect)] 为类型实现 PartialReflect + Reflect + 对应的子 trait(Struct/Enum/TupleStruct),让类型在运行时可自我描述
  • TypeRegistry 是反射类型的中央目录,按 TypeId 或类型路径字符串查找 TypeRegistration,后者持有 TypeInfoTypeData
  • apply 是反射的写入原语——把 DynamicStruct 等动态值"涂"到具体类型上,按字段名匹配,支持嵌套和部分更新
  • to_dynamic 把具体类型转成动态表示,用于序列化、网络传输、延迟写入
  • #[reflect(Default)] / #[reflect(Component)] 等属性把类型数据注册到 TypeRegistry,是 Scene、Inspector、BRP 能动态操作类型的前提
  • Scene、Inspector、BRP 全部建立在反射之上——类型路径字符串 → TypeRegistry 查找 → ReflectComponent/ReflectResource → apply 读写

练习

  1. 枚举反射:定义一个 #[derive(Reflect)] 枚举,包含至少两个 variant(一个无字段、一个有命名字段)。写一个函数,接受 &dyn PartialReflect,如果是枚举就打印当前 variant 名和字段值。

  2. 补丁构造器:实现一个 PatchBuilder,链式调用 .set("hp", 50i32).set("speed", 3.0f32) 构造 DynamicStruct,然后 apply 到目标结构体上。测试只修改部分字段。

  3. 类型浏览器:遍历 TypeRegistry 里所有注册的类型,打印每个类型的 type_path()short_type_path() 和它拥有的 TypeData 种类(ReflectDefaultReflectComponent 等)。提示:TypeRegistrationdata() 方法对每个 TypeData 类型分别调用。

  4. 序列化与反序列化:用 bevy::reflect::serde::ReflectSerializerReflectDeserializer 把一个 Reflect 值序列化成 RON 字符串,再反序列化回来,验证 reflect_partial_eqtrue。(需要启用 bevy/serialize feature。)