Unity2021.1调用AssetDatabase.SaveAssets报Broken text PPtr错误如何解决?
[Worker0] Broken text PPtr in file(Assets/Game/Dialogue/Dialogue.asset). Local file identifier (1528208011795455128) doesn't exist!
报错原因
Unity 2021.1版本收紧了资源引用的校验逻辑,该报错本质是主Dialogue.asset中引用了一个未被AssetDatabase记录的ScriptableObject实例:
你通过CreateInstance<DialogueNode>()创建的节点实例仅存在于内存中,没有作为嵌套子资源挂载到主Dialogue资产下,直接调用AssetDatabase.SaveAssets()时,Unity无法找到该节点对应的本地文件标识,就会抛出PPtr损坏的错误。旧版本Unity未做严格的即时校验,因此不会触发该报错。
手动点击保存按钮不报错的原因是两次操作间隔中,Unity编辑器的资源预处理线程已经完成了临时引用的缓存,绕过了即时校验,但本质问题仍然存在。
修复方案
- 新增子资源挂载逻辑:在
AddNode方法中,添加节点到列表后、调用保存前,用AssetDatabase.AddObjectToAsset()将新节点绑定到主资产:
private void AddNode(DialogueNode newNode) { newNode.Text = ""; nodes.Add(newNode); // 新增:将节点作为子资源挂载到当前Dialogue主资产 AssetDatabase.AddObjectToAsset(newNode, this); OnValidate(); Save(); }
- 优化保存逻辑:将全量保存改为仅保存当前变更的资产,避免触发无关资产的校验,同时提升保存效率:
private void Save() { // 标记主资产为脏 EditorUtility.SetDirty(this); // 仅保存当前有变更的资产,替代全量SaveAssets AssetDatabase.SaveAssetIfDirty(this); }
- 补充删除节点的配套逻辑:后续如果做节点删除功能,需要同步调用
AssetDatabase.RemoveObjectFromAsset(node)移除对应子资源,避免冗余的无效PPtr残留。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

