小结与练习
小结
- glTF 是 Bevy 的标准 3D 资产格式,加载器随
DefaultPlugins自动注册;AssetServer::load+WorldAssetRoot两步就能把模型摆上台 GltfAssetLabel是精准的取货地址:Scene(0)取场景、Node(i)取节点、Mesh(i)取网格、Animation(i)取动画;from_asset拼到路径后面,等价于#Scene0后缀- 加载完整
Gltf资产 可以拿到named_scenes、named_nodes、named_meshes等按名字索引的 HashMap——名字来自 Blender 里的命名 - glTF 材质自动映射到
StandardMaterial:base_color、metallic、perceptual_roughness、贴图等字段一一对应;GltfMaterialName组件记录每个网格的材质名 - 实例化:同一个
Handle<WorldAsset>克隆多份,各自带独立的Transform,GPU 上只有一份网格数据 WorldInstanceReady事件在场景实体全部就绪后触发,配合 Observer 可以遍历后代实体、按材质名查找并修改- 自定义
AssetLoader:实现AssetLoadertrait(load+extensions),init_asset+init_asset_loader注册,AssetServer::load就能加载你的格式
练习
- 换成自己的模型:在 Blender 里做一个简单物体(杯子、箱子),导出
.glb,放进assets/models/,修改 Listing 23-1 的路径加载它。试试在 Blender 里改名后导出,用 Listing 23-3 的代码看命名是否正确传递。 - 按节点名取子场景:修改 Listing 23-3,用
GltfAssetLabel::Node(0)加载单个节点而非整个场景,观察只出现一个部件。 - 材质遍历:修改 Listing 23-6,不只改
LeatherPartsMat,而是遍历所有材质,把金属感(metallic)全部拉到 1.0,看看效果。 - 加载进度条:结合第 10 章的 States 和第 14 章的进度条模式,给 Listing 23-7 加一个 UI 进度条——在加载完成前显示,完成后隐藏。
- 扩展自定义加载器:给 Listing 23-8 的
ConfigLoader加一个Settings类型,支持传入一个default_values: HashMap<String, String>,在解析时用默认值填补缺失的键。