| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- public class RestoreObjectPathHelper : MonoBehaviour
- {
- public void RestoreHierarchy(List<RestoreData> datas, PartMark[] allObjs)
- {
- datas.Sort((a, b) =>
- {
- int depthA = GetPathDepth(a.originalPath);
- int depthB = GetPathDepth(b.originalPath);
- return depthA.CompareTo(depthB);
- });
- Dictionary<string, Transform> pathToObjectDict = new Dictionary<string, Transform>();
- 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;
- }
- }
|