| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEditor;
- using UnityEngine;
- namespace TheraBytes.BetterUi.Editor.AlignDistribute
- {
- public static class Align
- {
- private static AlignMode alignMode;
- private static AlignTo alignTo;
- public static void AlignSelection(AlignMode alignMode, AlignTo alignTo)
- {
- Align.alignMode = alignMode;
- Align.alignTo = alignTo;
- Transform[] selection = Selection.GetTransforms(SelectionMode.TopLevel);
- RectTransform targetRectTransform = GetAlignTargetTransform(selection);
- //Rect targetRect = targetRectTransform.rect;
- // Debug.Log("[Align]\tTarget: \t" + targetRectTransform.name + "\n\tMode: \t" + alignMode);
- for (int i = 0; i < selection.Length; i++)
- {
- RectTransform rectTransform = (RectTransform)selection[i].transform;
- Undo.RecordObject(rectTransform, "Align " + alignTo);
- Vector3 oldPosition = rectTransform.position;
- Quaternion originalParentRotation = rectTransform.parent.rotation;
- rectTransform.parent.rotation = new Quaternion();
- rectTransform.position = GetAlignTargetPosition(rectTransform, targetRectTransform);
- rectTransform.parent.rotation = originalParentRotation;
- Utility.AdjustAnchors(rectTransform, oldPosition);
- }
- Utility.CleanUp();
- }
- private static RectTransform GetAlignTargetTransform(Transform[] selection)
- {
- switch (alignTo)
- {
- case AlignTo.Parent:
- return selection[0].parent as RectTransform;
- case AlignTo.FirstInHierarchy:
- return Utility.SortHierarchically(selection)[0] as RectTransform;
- case AlignTo.LastInHierarchy:
- return Utility.SortHierarchically(selection)[selection.Length - 1] as RectTransform;
- case AlignTo.SmallestObject:
- if (alignMode == AlignMode.Left || alignMode == AlignMode.Vertical || alignMode == AlignMode.Right)
- {
- return Utility.SortByWidth(selection)[0] as RectTransform;
- }
- else
- {
- return Utility.SortByHeight(selection)[0] as RectTransform;
- }
- case AlignTo.BiggestObject:
- if (alignMode == AlignMode.Left || alignMode == AlignMode.Vertical || alignMode == AlignMode.Right)
- {
- return Utility.SortByWidth(selection)[selection.Length - 1] as RectTransform;
- }
- else
- {
- return Utility.SortByHeight(selection)[selection.Length - 1] as RectTransform;
- }
- case AlignTo.SelectionBounds:
- return Utility.GetBoundingBoxRectTransform(selection);
- default:
- Debug.LogError("Unknown AlignTo: " + alignTo);
- throw new ArgumentOutOfRangeException();
- }
- }
- private static Vector3 GetAlignTargetPosition(RectTransform currentRectTransform, RectTransform targetRectTransform)
- {
- Vector3 position = currentRectTransform.position;
- if (currentRectTransform == targetRectTransform)
- {
- return position;
- }
- Vector2 currentSize = Utility.GetTransformSize(currentRectTransform);
- Vector2 targetSize = Utility.GetTransformSize(targetRectTransform);
- Vector2 currentPivotLocal = Utility.GetPivotAndCenterLocalDistance(currentRectTransform) + currentSize * 0.5f;
- Vector2 targetPivotLocal = Utility.GetPivotAndCenterLocalDistance(targetRectTransform) + targetSize * 0.5f;
- switch (alignMode)
- {
- case AlignMode.Left:
- position.x = currentPivotLocal.x + targetRectTransform.position.x - targetPivotLocal.x;
- break;
- case AlignMode.Right:
- position.x = targetSize.x - currentSize.x + currentPivotLocal.x
- + targetRectTransform.position.x - targetPivotLocal.x;
- break;
- case AlignMode.Vertical:
- position.x = Utility.GetPivotAndCenterLocalDistance(currentRectTransform).x
- + targetRectTransform.position.x - Utility.GetPivotAndCenterLocalDistance(targetRectTransform).x;
- break;
- case AlignMode.Bottom:
- position.y = currentPivotLocal.y + targetRectTransform.position.y - targetPivotLocal.y;
- break;
- case AlignMode.Top:
- position.y = targetSize.y - currentSize.y + currentPivotLocal.y
- + targetRectTransform.position.y - targetPivotLocal.y;
- break;
- case AlignMode.Horizontal:
- position.y = Utility.GetPivotAndCenterLocalDistance(currentRectTransform).y
- + targetRectTransform.position.y - Utility.GetPivotAndCenterLocalDistance(targetRectTransform).y;
- break;
- default:
- Debug.LogError("Unknown AlignMode: " + alignMode);
- throw new ArgumentOutOfRangeException();
- }
- return position;
- }
- }
- }
|