docs: sync mesh component assetref docs

This commit is contained in:
2026-04-03 16:02:03 +08:00
parent 7ab49fdbf3
commit ee44e14960
14 changed files with 550 additions and 236 deletions

View File

@@ -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)
这些访问器第一次被调用时,内部才会启动或收口异步材质加载。
## 相关文档