public static void BringForward(this RectTransform rectTransform) { Transform currentParent = rectTransform.parent; int currentIndex = rectTransform.GetSiblingIndex(); var rootObjects = UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects(); int siblingsCount = currentParent?.childCount ?? rootObjects.Length; if (currentIndex < siblingsCount - 1) { int nextIndex = currentIndex + 1; Transform nextSibling = currentParent != null ? currentParent.GetChild(nextIndex) : rootObjects[nextIndex].transform; bool isNextSibingExpanded = SceneHierarchyUtility.IsExpanded(nextSibling.gameObject); if (nextSibling.childCount > 0 && isNextSibingExpanded) { Undo.SetTransformParent(rectTransform, nextSibling, nameof(BringForward)); rectTransform.SetParent(nextSibling); rectTransform.SetAsFirstSibling(); EditorGUIUtility.PingObject(nextSibling); } else { Undo.SetTransformParent(rectTransform, currentParent, nameof(BringForward)); rectTransform.SetSiblingIndex(nextIndex); } } else if (currentParent != null && currentParent.parent != null) { Transform newParent = currentParent.parent; int newIndex = currentParent.GetSiblingIndex() + 1; Undo.SetTransformParent(rectTransform, newParent, nameof(BringForward)); rectTransform.SetParent(newParent); rectTransform.SetSiblingIndex(newIndex); EditorGUIUtility.PingObject(newParent); } }
public static void SendBackward(this RectTransform rectTransform) { Transform currentParent = rectTransform.parent; int currentIndex = rectTransform.GetSiblingIndex(); if (currentIndex > 0) { var rootObjects = UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects(); int previousIndex = currentIndex - 1; Transform previousSibling = currentParent != null ? currentParent.GetChild(previousIndex) : rootObjects[previousIndex].transform; bool isPreviousSibingExpanded = SceneHierarchyUtility.IsExpanded(previousSibling.gameObject); if (previousSibling.childCount > 0 && isPreviousSibingExpanded) { Undo.SetTransformParent(rectTransform, previousSibling, nameof(SendBackward)); rectTransform.SetParent(previousSibling); rectTransform.SetAsLastSibling(); EditorGUIUtility.PingObject(previousSibling); } else { Undo.SetTransformParent(rectTransform, currentParent, nameof(SendBackward)); rectTransform.SetSiblingIndex(previousIndex); } } else if (currentParent != null && currentParent.parent != null) { int currentParentIndex = currentParent.GetSiblingIndex(); Transform newParent = currentParent.parent; Undo.SetTransformParent(rectTransform, newParent, nameof(SendBackward)); rectTransform.SetParent(newParent); rectTransform.SetSiblingIndex(currentParentIndex); EditorGUIUtility.PingObject(newParent); } }