小结与练习
本章要点
#[derive(Reflect)]为类型实现PartialReflect+Reflect+ 对应的子 trait(Struct/Enum/TupleStruct),让类型在运行时可自我描述TypeRegistry是反射类型的中央目录,按TypeId或类型路径字符串查找TypeRegistration,后者持有TypeInfo和TypeDataapply是反射的写入原语——把DynamicStruct等动态值"涂"到具体类型上,按字段名匹配,支持嵌套和部分更新to_dynamic把具体类型转成动态表示,用于序列化、网络传输、延迟写入#[reflect(Default)]/#[reflect(Component)]等属性把类型数据注册到 TypeRegistry,是 Scene、Inspector、BRP 能动态操作类型的前提- Scene、Inspector、BRP 全部建立在反射之上——类型路径字符串 → TypeRegistry 查找 → ReflectComponent/ReflectResource → apply 读写
练习
枚举反射:定义一个
#[derive(Reflect)]枚举,包含至少两个 variant(一个无字段、一个有命名字段)。写一个函数,接受&dyn PartialReflect,如果是枚举就打印当前 variant 名和字段值。补丁构造器:实现一个
PatchBuilder,链式调用.set("hp", 50i32).set("speed", 3.0f32)构造DynamicStruct,然后apply到目标结构体上。测试只修改部分字段。类型浏览器:遍历
TypeRegistry里所有注册的类型,打印每个类型的type_path()、short_type_path()和它拥有的 TypeData 种类(ReflectDefault、ReflectComponent等)。提示:TypeRegistration的data()方法对每个 TypeData 类型分别调用。序列化与反序列化:用
bevy::reflect::serde::ReflectSerializer和ReflectDeserializer把一个 Reflect 值序列化成 RON 字符串,再反序列化回来,验证reflect_partial_eq为true。(需要启用bevy/serializefeature。)