RestoreObjectPathHelper.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. public class RestoreObjectPathHelper : MonoBehaviour
  5. {
  6. public void RestoreHierarchy(List<RestoreData> datas, PartMark[] allObjs)
  7. {
  8. datas.Sort((a, b) =>
  9. {
  10. int depthA = GetPathDepth(a.originalPath);
  11. int depthB = GetPathDepth(b.originalPath);
  12. return depthA.CompareTo(depthB);
  13. });
  14. Dictionary<string, Transform> pathToObjectDict = new Dictionary<string, Transform>();
  15. pathToObjectDict.Clear();
  16. foreach (PartMark item in allObjs)
  17. {
  18. pathToObjectDict.Add(GetAllParentPath(item.transform), item.transform);
  19. }
  20. foreach (RestoreData tmpItem in datas)
  21. {
  22. string[] pathParts = tmpItem.originalPath.Split('/');
  23. // 如果是根节点,直接放到场景根目录
  24. if (pathParts.Length == 1)
  25. {
  26. tmpItem.targetObject.transform.SetParent(null);
  27. continue;
  28. }
  29. // 查找父节点
  30. string parentPath = tmpItem.originalPath.Substring(0, tmpItem.originalPath.LastIndexOf('/'));
  31. Transform parentObject = null;
  32. if (pathToObjectDict.ContainsKey(parentPath))
  33. {
  34. parentObject = pathToObjectDict[parentPath];
  35. }
  36. // 设置父节点
  37. if (parentObject != null)
  38. {
  39. tmpItem.targetObject.transform.SetParent(parentObject);
  40. pathToObjectDict[tmpItem.originalPath] = tmpItem.targetObject;
  41. }
  42. else
  43. {
  44. tmpItem.targetObject.transform.SetParent(null);
  45. Debug.LogError($"找不到父节点: {parentPath},物体 {tmpItem.targetObject.name} 被放置在根目录");
  46. }
  47. pathToObjectDict.Clear();
  48. foreach (PartMark item in allObjs)
  49. {
  50. pathToObjectDict.Add(GetAllParentPath(item.transform), item.transform);
  51. }
  52. }
  53. }
  54. public class RestoreData
  55. {
  56. public Transform targetObject;
  57. public string originalPath;
  58. public RestoreData(Transform targetObject, string originalPath)
  59. {
  60. this.targetObject = targetObject;
  61. this.originalPath = originalPath;
  62. }
  63. }
  64. private int GetPathDepth(string path)
  65. {
  66. if (string.IsNullOrEmpty(path)) return 0;
  67. return path.Split('/').Length;
  68. }
  69. public string GetAllParentPath(Transform tmpItem)
  70. {
  71. string path = tmpItem.name;
  72. Transform tmpParent = tmpItem.parent;
  73. while (tmpParent != null)
  74. {
  75. path = tmpParent.name + "/" + path;
  76. tmpParent = tmpParent.parent;
  77. }
  78. return "/" + path;
  79. }
  80. }