Files
XCEngine/docs/api/XCEngine/Components/MeshRendererComponent/Deserialize.md

87 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MeshRendererComponent::Deserialize
反序列化材质槽和渲染标志。
```cpp
void Deserialize(std::istream& is) override;
```
## 当前实现行为
当前实现会先:
1. 调用 `ClearMaterials()`
2. 把默认值重置为:
- `castShadows = true`
- `receiveShadows = true`
- `renderLayer = 0`
然后只解析:
- `materialPaths=<path0|path1|...>`
- `materialRefs=<guid,localId,resourceType|...>`
- `castShadows`
- `receiveShadows`
- `renderLayer`
## 恢复顺序
### 1. 某槽位 `materialRef` 有效
这是当前项目材质恢复的主路径。
当前会先保存 `m_materialRefs[i] = pendingMaterialRefs[i]`,然后分两种情况:
-`ResourceManager::IsDeferredSceneLoadEnabled()` 为真
- 先尝试 `TryResolveAssetPath(materialRef, resolvedPath)`
- 成功时只恢复 `m_materialPaths[i] = resolvedPath`
- 不立即同步加载材质
- 若不在 deferred 模式,或 deferred 下未成功解析路径
- 直接 `Load<Material>(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)