当选中多个资源 查找引用时,有的资源引用不显示,解决方法:
把ReferenceFinderWindow脚本原来的 while(stack.Count > 0) { ... if (!memo.ContainsKey(current[0])) { ... } } 替换为下面这段。
csharp
// 替换原来的 while(stack.Count > 0) { ... } 整段
var retryCount = new Dictionary<string, int>();
while (stack.Count > 0)
{
var current = stack.Pop();
string guid = current[0];
int curDepth = int.Parse(current[1]);
string parentGuid = current[2];
// CreateTree 会在 memo 里返回已存在的节点或新建一个并加入 memo
var child = CreateTree(guid, ref elementCount, curDepth, stack, memo);
if (child == null)
continue;
if (string.IsNullOrEmpty(parentGuid))
{
// 直接挂到根(避免重复)
if (root.children == null || !root.children.Contains(child))
root.AddChild(child);
continue;
}
// 父节点已存在,则直接挂上去(避免重复)
if (memo.TryGetValue(parentGuid, out AssetViewItem parentItem))
{
if (parentItem.children == null || !parentItem.children.Contains(child))
parentItem.AddChild(child);
// 成功挂上,重试计数可清除(若有)
if (retryCount.ContainsKey(guid)) retryCount.Remove(guid);
continue;
}
else
{
// 父节点还不存在:重试逻辑(将当前项压回栈,等待父节点被创建)
int attempts = 0;
retryCount.TryGetValue(guid, out attempts);
attempts++;
retryCount[guid] = attempts;
if (attempts <= 4) // 重试上限(可调整)
{
stack.Push(current); // 稍后再试一次
}
else
{
// 父节点长时间未出现 -> 降级把它挂到 root,避免死循环
if (root.children == null || !root.children.Contains(child))
root.AddChild(child);
retryCount.Remove(guid);
Debug.LogWarning($"ReferenceFinder: parent {parentGuid} for {guid} not found after retries, attached to root.");
}
}
}
思路:
不再在外面直接跳过 memo 已有项;改为 总是拿到节点(CreateTree 自身会返回已存在的 memo 项),然后尝试把它挂到当前父节点上(如果父节点还没创建则把当前项压回栈并记录重试次数,避免无限循环)。
加了个 retryCount 字典:若某节点连续多次尝试仍然找不到父节点,则把它挂到 root(降级处理),避免死循环。