docs: sync mesh component assetref docs
This commit is contained in:
@@ -6,44 +6,76 @@
|
||||
void Deserialize(std::istream& is) override;
|
||||
```
|
||||
|
||||
## 行为说明
|
||||
## 当前实现行为
|
||||
|
||||
当前实现会:
|
||||
当前实现会先:
|
||||
|
||||
1. 先清空材质并重置默认标志。
|
||||
2. 解析 `materialPaths`、`materialRefs`、`castShadows`、`receiveShadows` 和 `renderLayer`。
|
||||
3. 兼容读取历史 `materials=` 键,并把它当作 `materialPaths=` 处理。
|
||||
4. 让 `m_materials`、`m_materialPaths`、`m_materialRefs`、pending 数组和 async 标记数组在槽位数量上重新对齐。
|
||||
1. 调用 `ClearMaterials()`
|
||||
2. 把默认值重置为:
|
||||
- `castShadows = true`
|
||||
- `receiveShadows = true`
|
||||
- `renderLayer = 0`
|
||||
|
||||
随后每个槽位按下面的优先级恢复:
|
||||
然后只解析:
|
||||
|
||||
1. 如果 `materialRef` 有效,先尝试按 `AssetRef` 恢复。
|
||||
2. 如果当前处于 deferred scene load,优先尝试把 `AssetRef` 重新解析回路径,但不立即同步加载材质。
|
||||
3. 如果没有有效 `AssetRef`,或者按 `AssetRef` 恢复失败,再退回到路径恢复。
|
||||
4. 只有在非 deferred 路径下,才会直接调用 [SetMaterialPath](SetMaterialPath.md) 做同步加载。
|
||||
- `materialPaths=<path0|path1|...>`
|
||||
- `materialRefs=<guid,localId,resourceType|...>`
|
||||
- `castShadows`
|
||||
- `receiveShadows`
|
||||
- `renderLayer`
|
||||
|
||||
这意味着“反序列化完成”并不等于“所有材质句柄都已经可用”。
|
||||
## 恢复顺序
|
||||
|
||||
## 当前实现说明
|
||||
### 1. 某槽位 `materialRef` 有效
|
||||
|
||||
- 默认值是:`castShadows = true`、`receiveShadows = true`、`renderLayer = 0`。
|
||||
- 如果某个槽位最终只恢复出了路径或 `AssetRef`,对应 `m_materials[index]` 仍可能为空。
|
||||
- 在 deferred scene load 模式下,真正的兑现通常要等首次 [GetMaterial](GetMaterial.md) 或 [GetMaterialHandle](GetMaterialHandle.md) 调用时才会触发。
|
||||
这是当前项目材质恢复的主路径。
|
||||
|
||||
## 项目资产恢复语义
|
||||
当前会先保存 `m_materialRefs[i] = pendingMaterialRefs[i]`,然后分两种情况:
|
||||
|
||||
当前实现特别强调项目资产的稳定恢复:
|
||||
- 若 `ResourceManager::IsDeferredSceneLoadEnabled()` 为真
|
||||
- 先尝试 `TryResolveAssetPath(materialRef, resolvedPath)`
|
||||
- 成功时只恢复 `m_materialPaths[i] = resolvedPath`
|
||||
- 不立即同步加载材质
|
||||
- 若不在 deferred 模式,或 deferred 下未成功解析路径
|
||||
- 直接 `Load<Material>(pendingMaterialRef)`
|
||||
- 成功时从句柄反写 `m_materialPaths[i]`
|
||||
|
||||
- 当场景文本里有有效 `materialRef=` 时,组件会尽量依赖它,而不是单纯依赖字符串路径。
|
||||
- 如果 `AssetRef` 能解析到当前项目中的材质,路径会被重新规范化回 `Assets/...`。
|
||||
- 如果解析失败,仍会回退到文本路径。
|
||||
### 2. 某槽位 `materialRef` 无效
|
||||
|
||||
这和商业引擎常见的“文本可读路径 + 稳定内部引用”双轨设计一致,优点是既便于调试,也能提高资源重命名后的恢复成功率。
|
||||
这时只剩路径回退分支:
|
||||
|
||||
## 兼容性说明
|
||||
- 若 `m_materialPaths[i]` 不是 virtual scheme,当前会直接清空该路径
|
||||
- 若是 virtual scheme 且处于 deferred 模式,则只保留路径
|
||||
- 若是 virtual scheme 且不在 deferred 模式,则调用 [SetMaterialPath](SetMaterialPath.md) 走同步加载
|
||||
|
||||
- 仍兼容历史 `materials=` 文本。
|
||||
- 新版 [Serialize](Serialize.md) 不再输出 `materials=`。
|
||||
## 已删除的旧心智
|
||||
|
||||
这页当前必须明确:
|
||||
|
||||
- 不再读取历史 `materials=` 键
|
||||
- 不再把“没有 `AssetRef` 的普通项目路径”当作正式项目材质恢复协议
|
||||
|
||||
因此像下面这种旧式数据:
|
||||
|
||||
```text
|
||||
materialPaths=Assets/runtime.material;materialRefs=;
|
||||
```
|
||||
|
||||
当前恢复后,这个普通路径会被清掉,而不是继续被保留。
|
||||
|
||||
## 与 deferred scene load 的关系
|
||||
|
||||
在 deferred 模式下,反序列化阶段通常只恢复:
|
||||
|
||||
- `m_materialRefs`
|
||||
- `m_materialPaths`
|
||||
|
||||
真正材质句柄的兑现,往往留到后续:
|
||||
|
||||
- [GetMaterial](GetMaterial.md)
|
||||
- [GetMaterialHandle](GetMaterialHandle.md)
|
||||
|
||||
这些访问器第一次被调用时,内部才会启动或收口异步材质加载。
|
||||
|
||||
## 相关文档
|
||||
|
||||
|
||||
Reference in New Issue
Block a user