0

我最近升级了我的 Unity 2021.1 版本,现在当我调用 AssetDatabase.SaveAssets() 时,我收到了错误

[Worker0] Broken text PPtr in file(Assets/Game/Dialogue/Dialogue.asset). Local file identifier (1528208011795455128) doesn't exist!

在以前的 Unity 版本中,我从未遇到过此错误。一切仍然有效,但此错误确实会在 AseetDatabase.SaveAssets() 调用的控制台中弹出。只有当我为我的对话系统创建一个新节点时才会发生这种情况。

我在对话框编辑器中添加了一个按钮,而不是单击它时调用 AssetDatabase.SaveAssets() ,这不会引发错误,但我不想要这个。每当我添加一个新节点时,我都想保存。

public DialogueNode CreateNode(DialogueNode parent, Vector2 position)
{
    var newNode = MakeNode(parent, position);
    
    Undo.RegisterCreatedObjectUndo(newNode, "Create Dialogue Node");
    Undo.RecordObject(this, "Add Dialogue Node");
    
    AddNode(newNode);
    
    return newNode;
}

private DialogueNode MakeNode(DialogueNode parent, Vector2 position)
{
    DialogueNode newNode = CreateInstance<DialogueNode>();
    newNode.name = Guid.NewGuid().ToString();
    newNode.SetSize(140, 40);
    if (parent != null)
    {
        parent.AddChild(newNode.name);
        newNode.Parent = parent;
        newNode.IsPlayerSpeaking = !parent.IsPlayerSpeaking;
    
        newNode.SetPosition(parent.Rect.position + newNodeOffset, Grid.GridSnapSize);
    
        if (parent.Children.Count > 1)
            parent.SetSize(new Rect(parent.Rect.x, parent.Rect.y, 150, 40));
    }
    else
    {
        newNode.SetPosition(position, Grid.GridSnapSize);
    }
    
    return newNode;
}

private void AddNode(DialogueNode newNode)
{
    newNode.Text = "";
    nodes.Add(newNode);
    OnValidate();
    Save();
}

private void Save() => AssetDatabase.SaveAssets();

public void CreateNew()
{
    if (nameForNew == "")
        return;

    var newItem = ScriptableObject.CreateInstance<T>();
    newItem.name = "New " + typeof(T); //May not need

    if (path == "")
     path = "Assets/";

     AssetDatabase.CreateAsset(newItem, path + "\\" + nameForNew + ".asset");
     AssetDatabase.SaveAssets();

     nameForNew = "";
}
4

2 回答 2

0

我认为您应该尝试明确地使用AssetDatabase.CreateAsset新创建的资产。

  • 比在整个项目中保存所有资产更有意义
  • 您的新资产还没有任何保存路径,那么您希望 unity 在哪里持久保存它?

您基本上只创建和存储 ScriptableObjec 的“虚拟”实例,而没有相应的持久资产......

所以我认为错误意味着您正在尝试保存(=序列化)您的基本/父节点,包括相应的子节点引用。

但是,由于您从不创建实际资产,因此这些引用无法序列化并且仅临时有效。

于 2021-09-12T20:54:36.987 回答
0

经过多次反复试验和数小时的调试,我能够解决它。

EditorApplication.delayCall += AssetDatabase.SaveAssets;

现在,每当我从 Save() 函数调用 AssetDatabase.SaveAssets() 时,我不再收到这些错误。看来我必须等待检查员更新。使用此方法,对 AssetDatabase.SaveAssets() 的调用将被延迟,直到检查器被刷新。

于 2021-09-12T23:58:16.463 回答