Skip to content

小结与练习

小结

  • glTF 是 Bevy 的标准 3D 资产格式,加载器随 DefaultPlugins 自动注册;AssetServer::load + WorldAssetRoot 两步就能把模型摆上台
  • GltfAssetLabel 是精准的取货地址:Scene(0) 取场景、Node(i) 取节点、Mesh(i) 取网格、Animation(i) 取动画;from_asset 拼到路径后面,等价于 #Scene0 后缀
  • 加载完整 Gltf 资产 可以拿到 named_scenesnamed_nodesnamed_meshes 等按名字索引的 HashMap——名字来自 Blender 里的命名
  • glTF 材质自动映射到 StandardMaterialbase_colormetallicperceptual_roughness、贴图等字段一一对应;GltfMaterialName 组件记录每个网格的材质名
  • 实例化:同一个 Handle<WorldAsset> 克隆多份,各自带独立的 Transform,GPU 上只有一份网格数据
  • WorldInstanceReady 事件在场景实体全部就绪后触发,配合 Observer 可以遍历后代实体、按材质名查找并修改
  • 自定义 AssetLoader:实现 AssetLoader trait(load + extensions),init_asset + init_asset_loader 注册,AssetServer::load 就能加载你的格式

练习

  1. 换成自己的模型:在 Blender 里做一个简单物体(杯子、箱子),导出 .glb,放进 assets/models/,修改 Listing 23-1 的路径加载它。试试在 Blender 里改名后导出,用 Listing 23-3 的代码看命名是否正确传递。
  2. 按节点名取子场景:修改 Listing 23-3,用 GltfAssetLabel::Node(0) 加载单个节点而非整个场景,观察只出现一个部件。
  3. 材质遍历:修改 Listing 23-6,不只改 LeatherPartsMat,而是遍历所有材质,把金属感(metallic)全部拉到 1.0,看看效果。
  4. 加载进度条:结合第 10 章的 States 和第 14 章的进度条模式,给 Listing 23-7 加一个 UI 进度条——在加载完成前显示,完成后隐藏。
  5. 扩展自定义加载器:给 Listing 23-8 的 ConfigLoader 加一个 Settings 类型,支持传入一个 default_values: HashMap<String, String>,在解析时用默认值填补缺失的键。