Nessuna descrizione
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TilePalettePrefabUtility.cs 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System.Collections.Generic;
  2. using UnityEditor.SceneManagement;
  3. using UnityEngine;
  4. namespace UnityEditor.Tilemaps
  5. {
  6. internal class TilePalettePrefabUtility
  7. {
  8. internal static bool IsObjectPrefabInstance(Object target)
  9. {
  10. return target != null && PrefabUtility.IsPartOfRegularPrefab(target);
  11. }
  12. internal static GameObject FindPrefabInstanceEquivalent(GameObject prefabInstance, GameObject prefabTarget)
  13. {
  14. var prefabRoot = prefabTarget.transform.root.gameObject;
  15. var currentTransform = prefabTarget.transform;
  16. var reverseTransformOrder = new Stack<int>();
  17. while (currentTransform != prefabRoot.transform && currentTransform.parent != null)
  18. {
  19. var parentTransform = currentTransform.parent;
  20. for (int i = 0; i < parentTransform.childCount; ++i)
  21. {
  22. if (currentTransform == parentTransform.GetChild(i))
  23. {
  24. reverseTransformOrder.Push(i);
  25. break;
  26. }
  27. }
  28. currentTransform = currentTransform.parent;
  29. }
  30. currentTransform = prefabInstance.transform;
  31. while (reverseTransformOrder.Count > 0)
  32. {
  33. var childIndex = reverseTransformOrder.Pop();
  34. if (childIndex >= currentTransform.childCount)
  35. return null;
  36. currentTransform = currentTransform.GetChild(childIndex);
  37. }
  38. return currentTransform.gameObject;
  39. }
  40. internal static void GoToPrefabMode(GameObject target)
  41. {
  42. var prefabObject = PrefabUtility.GetCorrespondingObjectFromSource(target);
  43. var assetPath = AssetDatabase.GetAssetPath(prefabObject);
  44. var stage = PrefabStageUtility.OpenPrefab(assetPath);
  45. var prefabInstance = stage.prefabContentsRoot;
  46. var prefabTarget = FindPrefabInstanceEquivalent(prefabInstance, prefabObject);
  47. if (prefabTarget != null)
  48. {
  49. GridPaintingState.scenePaintTarget = prefabTarget;
  50. }
  51. }
  52. }
  53. }