# MeshRendererComponent::Deserialize 反序列化材质槽和渲染标志。 ```cpp void Deserialize(std::istream& is) override; ``` ## 当前实现行为 当前实现会先: 1. 调用 `ClearMaterials()` 2. 把默认值重置为: - `castShadows = true` - `receiveShadows = true` - `renderLayer = 0` 然后只解析: - `materialPaths=` - `materialRefs=` - `castShadows` - `receiveShadows` - `renderLayer` ## 恢复顺序 ### 1. 某槽位 `materialRef` 有效 这是当前项目材质恢复的主路径。 当前会先保存 `m_materialRefs[i] = pendingMaterialRefs[i]`,然后分两种情况: - 若 `ResourceManager::IsDeferredSceneLoadEnabled()` 为真 - 先尝试 `TryResolveAssetPath(materialRef, resolvedPath)` - 成功时只恢复 `m_materialPaths[i] = resolvedPath` - 不立即同步加载材质 - 若不在 deferred 模式,或 deferred 下未成功解析路径 - 直接 `Load(pendingMaterialRef)` - 成功时从句柄反写 `m_materialPaths[i]` ### 2. 某槽位 `materialRef` 无效 这时只剩路径回退分支: - 若 `m_materialPaths[i]` 不是 virtual scheme,当前会直接清空该路径 - 若是 virtual scheme 且处于 deferred 模式,则只保留路径 - 若是 virtual scheme 且不在 deferred 模式,则调用 [SetMaterialPath](SetMaterialPath.md) 走同步加载 ## 已删除的旧心智 这页当前必须明确: - 不再读取历史 `materials=` 键 - 不再把“没有 `AssetRef` 的普通项目路径”当作正式项目材质恢复协议 因此像下面这种旧式数据: ```text materialPaths=Assets/runtime.material;materialRefs=; ``` 当前恢复后,这个普通路径会被清掉,而不是继续被保留。 ## 与 deferred scene load 的关系 在 deferred 模式下,反序列化阶段通常只恢复: - `m_materialRefs` - `m_materialPaths` 真正材质句柄的兑现,往往留到后续: - [GetMaterial](GetMaterial.md) - [GetMaterialHandle](GetMaterialHandle.md) 这些访问器第一次被调用时,内部才会启动或收口异步材质加载。 ## 相关文档 - [返回类型总览](MeshRendererComponent.md) - [Serialize](Serialize.md) - [GetMaterial](GetMaterial.md) - [GetMaterialHandle](GetMaterialHandle.md) - [GetMaterialAssetRefs](GetMaterialAssetRefs.md)