我最近升級了我的Unity 2021.1版本,現在當我呼叫AssetDatabase.SaveAssets()時,我得到了錯誤的提示
[] 破碎的文本 PPtr in file(Assets/Game/Dialogue/Dialogue. asset)。) 本地檔案識別符號(1528208011795455128) 不存在!
我在以前的Unity版本中從未出現過這個錯誤。一切都還在運行,但這個錯誤確實在AseetDatabase.SaveAssets()呼叫的控制臺中彈出。它只在我為我的對話系統創建一個新節點時發生。
我在我的對話編輯器中添加了一個按鈕,當點擊它時,它會呼叫AssetDatabase.SaveAssets(),這不會引發錯誤,但我不希望這樣。我希望每當我添加一個新的節點時都能保存。
public DialogueNode CreateNode(DialogueNode parent。Vector2 position)。
{
var newNode = MakeNode(parent, position);
Undo.RegisterCreatedObjectUndo(newNode, "創建對話節點")。
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();
保存()。
}
private void Save()=> AssetDatabase.SaveAssets()。
public void CreateNew()。
{
if (nameForNew == ""/span>)
return;
var newItem = ScriptableObject.CreateInstance<T>()。
newItem.name = "New" typeof(T); //可能不需要
if (path == ""/span>)
path = "Assets/"。
AssetDatabase.CreateAsset(newItem, path "/span> nameForNew ".asset")。
AssetDatabase.SaveAssets();
nameForNew = "";
}
uj5u.com熱心網友回復:
我認為你應該嘗試相當明確地使用AssetDatabase.CreateAsset為你新創建的資產。
- 比在整個專案中保存所有資產更有意義 。
- 你的新資產還沒有任何保存路徑,所以你希望unity將它持久地保存在哪里?
你基本上只創建并存盤了一個ScriptableObjec的 "虛擬 "實體,而沒有相應的持久性資產......
所以我認為這個錯誤的意思是你試圖保存(=序列化)你的基礎/父節點,包括相應的子節點參考。
然而,由于你從未創建過實際的資產,所以這些參考不能被序列化,只能暫時有效。
uj5u.com熱心網友回復:
經過多次試錯和數小時的除錯,我終于解決了這個問題。
EditorApplication.delayCall = AssetDatabase.SaveAssets;
現在每當我從Save()函式中呼叫AssetDatabase.SaveAssets()時,我不再得到這些錯誤。似乎我必須等待檢查器被更新。 有了這個方法,對 AssetDatabase.SaveAssets() 的呼叫將被延遲,直到檢查器被重繪 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/312674.html
標籤:
