using System.Collections.Generic; using System.Linq; using UnityEngine; public class RestoreObjectPathHelper : MonoBehaviour { public void RestoreHierarchy(List datas, PartMark[] allObjs) { datas.Sort((a, b) => { int depthA = GetPathDepth(a.originalPath); int depthB = GetPathDepth(b.originalPath); return depthA.CompareTo(depthB); }); Dictionary pathToObjectDict = new Dictionary(); pathToObjectDict.Clear(); foreach (PartMark item in allObjs) { pathToObjectDict.Add(GetAllParentPath(item.transform), item.transform); } foreach (RestoreData tmpItem in datas) { string[] pathParts = tmpItem.originalPath.Split('/'); // 如果是根节点,直接放到场景根目录 if (pathParts.Length == 1) { tmpItem.targetObject.transform.SetParent(null); continue; } // 查找父节点 string parentPath = tmpItem.originalPath.Substring(0, tmpItem.originalPath.LastIndexOf('/')); Transform parentObject = null; if (pathToObjectDict.ContainsKey(parentPath)) { parentObject = pathToObjectDict[parentPath]; } // 设置父节点 if (parentObject != null) { tmpItem.targetObject.transform.SetParent(parentObject); pathToObjectDict[tmpItem.originalPath] = tmpItem.targetObject; } else { tmpItem.targetObject.transform.SetParent(null); Debug.LogError($"找不到父节点: {parentPath},物体 {tmpItem.targetObject.name} 被放置在根目录"); } pathToObjectDict.Clear(); foreach (PartMark item in allObjs) { pathToObjectDict.Add(GetAllParentPath(item.transform), item.transform); } } } public class RestoreData { public Transform targetObject; public string originalPath; public RestoreData(Transform targetObject, string originalPath) { this.targetObject = targetObject; this.originalPath = originalPath; } } private int GetPathDepth(string path) { if (string.IsNullOrEmpty(path)) return 0; return path.Split('/').Length; } public string GetAllParentPath(Transform tmpItem) { string path = tmpItem.name; Transform tmpParent = tmpItem.parent; while (tmpParent != null) { path = tmpParent.name + "/" + path; tmpParent = tmpParent.parent; } return "/" + path; } }