Align.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace TheraBytes.BetterUi.Editor.AlignDistribute
  7. {
  8. public static class Align
  9. {
  10. private static AlignMode alignMode;
  11. private static AlignTo alignTo;
  12. public static void AlignSelection(AlignMode alignMode, AlignTo alignTo)
  13. {
  14. Align.alignMode = alignMode;
  15. Align.alignTo = alignTo;
  16. Transform[] selection = Selection.GetTransforms(SelectionMode.TopLevel);
  17. RectTransform targetRectTransform = GetAlignTargetTransform(selection);
  18. //Rect targetRect = targetRectTransform.rect;
  19. // Debug.Log("[Align]\tTarget: \t" + targetRectTransform.name + "\n\tMode: \t" + alignMode);
  20. for (int i = 0; i < selection.Length; i++)
  21. {
  22. RectTransform rectTransform = (RectTransform)selection[i].transform;
  23. Undo.RecordObject(rectTransform, "Align " + alignTo);
  24. Vector3 oldPosition = rectTransform.position;
  25. Quaternion originalParentRotation = rectTransform.parent.rotation;
  26. rectTransform.parent.rotation = new Quaternion();
  27. rectTransform.position = GetAlignTargetPosition(rectTransform, targetRectTransform);
  28. rectTransform.parent.rotation = originalParentRotation;
  29. Utility.AdjustAnchors(rectTransform, oldPosition);
  30. }
  31. Utility.CleanUp();
  32. }
  33. private static RectTransform GetAlignTargetTransform(Transform[] selection)
  34. {
  35. switch (alignTo)
  36. {
  37. case AlignTo.Parent:
  38. return selection[0].parent as RectTransform;
  39. case AlignTo.FirstInHierarchy:
  40. return Utility.SortHierarchically(selection)[0] as RectTransform;
  41. case AlignTo.LastInHierarchy:
  42. return Utility.SortHierarchically(selection)[selection.Length - 1] as RectTransform;
  43. case AlignTo.SmallestObject:
  44. if (alignMode == AlignMode.Left || alignMode == AlignMode.Vertical || alignMode == AlignMode.Right)
  45. {
  46. return Utility.SortByWidth(selection)[0] as RectTransform;
  47. }
  48. else
  49. {
  50. return Utility.SortByHeight(selection)[0] as RectTransform;
  51. }
  52. case AlignTo.BiggestObject:
  53. if (alignMode == AlignMode.Left || alignMode == AlignMode.Vertical || alignMode == AlignMode.Right)
  54. {
  55. return Utility.SortByWidth(selection)[selection.Length - 1] as RectTransform;
  56. }
  57. else
  58. {
  59. return Utility.SortByHeight(selection)[selection.Length - 1] as RectTransform;
  60. }
  61. case AlignTo.SelectionBounds:
  62. return Utility.GetBoundingBoxRectTransform(selection);
  63. default:
  64. Debug.LogError("Unknown AlignTo: " + alignTo);
  65. throw new ArgumentOutOfRangeException();
  66. }
  67. }
  68. private static Vector3 GetAlignTargetPosition(RectTransform currentRectTransform, RectTransform targetRectTransform)
  69. {
  70. Vector3 position = currentRectTransform.position;
  71. if (currentRectTransform == targetRectTransform)
  72. {
  73. return position;
  74. }
  75. Vector2 currentSize = Utility.GetTransformSize(currentRectTransform);
  76. Vector2 targetSize = Utility.GetTransformSize(targetRectTransform);
  77. Vector2 currentPivotLocal = Utility.GetPivotAndCenterLocalDistance(currentRectTransform) + currentSize * 0.5f;
  78. Vector2 targetPivotLocal = Utility.GetPivotAndCenterLocalDistance(targetRectTransform) + targetSize * 0.5f;
  79. switch (alignMode)
  80. {
  81. case AlignMode.Left:
  82. position.x = currentPivotLocal.x + targetRectTransform.position.x - targetPivotLocal.x;
  83. break;
  84. case AlignMode.Right:
  85. position.x = targetSize.x - currentSize.x + currentPivotLocal.x
  86. + targetRectTransform.position.x - targetPivotLocal.x;
  87. break;
  88. case AlignMode.Vertical:
  89. position.x = Utility.GetPivotAndCenterLocalDistance(currentRectTransform).x
  90. + targetRectTransform.position.x - Utility.GetPivotAndCenterLocalDistance(targetRectTransform).x;
  91. break;
  92. case AlignMode.Bottom:
  93. position.y = currentPivotLocal.y + targetRectTransform.position.y - targetPivotLocal.y;
  94. break;
  95. case AlignMode.Top:
  96. position.y = targetSize.y - currentSize.y + currentPivotLocal.y
  97. + targetRectTransform.position.y - targetPivotLocal.y;
  98. break;
  99. case AlignMode.Horizontal:
  100. position.y = Utility.GetPivotAndCenterLocalDistance(currentRectTransform).y
  101. + targetRectTransform.position.y - Utility.GetPivotAndCenterLocalDistance(targetRectTransform).y;
  102. break;
  103. default:
  104. Debug.LogError("Unknown AlignMode: " + alignMode);
  105. throw new ArgumentOutOfRangeException();
  106. }
  107. return position;
  108. }
  109. }
  110. }