2.3 KiB
2.3 KiB
MeshRendererComponent::Deserialize
反序列化材质槽和渲染标志。
void Deserialize(std::istream& is) override;
当前实现行为
当前实现会先:
- 调用
ClearMaterials() - 把默认值重置为:
castShadows = truereceiveShadows = truerenderLayer = 0
然后只解析:
materialPaths=<path0|path1|...>materialRefs=<guid,localId,resourceType|...>castShadowsreceiveShadowsrenderLayer
恢复顺序
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 走同步加载
已删除的旧心智
这页当前必须明确:
- 不再读取历史
materials=键 - 不再把“没有
AssetRef的普通项目路径”当作正式项目材质恢复协议
因此像下面这种旧式数据:
materialPaths=Assets/runtime.material;materialRefs=;
当前恢复后,这个普通路径会被清掉,而不是继续被保留。
与 deferred scene load 的关系
在 deferred 模式下,反序列化阶段通常只恢复:
m_materialRefsm_materialPaths
真正材质句柄的兑现,往往留到后续:
这些访问器第一次被调用时,内部才会启动或收口异步材质加载。