namespace UIWidgets { using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// /// UI utilities. /// public static class UtilitiesUI { static List ParentCanvases = new List(); /// /// Finds the canvas. /// /// The canvas. /// Current object. public static RectTransform FindCanvas(Transform currentObject) { var canvas = currentObject.GetComponentInParent(); if (canvas == null) { return null; } return canvas.transform as RectTransform; } /// /// Finds the topmost canvas. /// /// The canvas. /// Current object. public static RectTransform FindTopmostCanvas(Transform currentObject) { currentObject.GetComponentsInParent(true, ParentCanvases); if (ParentCanvases.Count == 0) { return null; } var result = ParentCanvases[ParentCanvases.Count - 1].transform as RectTransform; ParentCanvases.Clear(); return result; } /// /// Calculates the drag position. /// /// The drag position. /// Screen position. /// Canvas. /// Canvas RectTransform. public static Vector3 CalculateDragPosition(Vector3 screenPosition, Canvas canvas, RectTransform canvasRect) { Vector3 result; var canvasSize = canvasRect.sizeDelta; Vector2 min = Vector2.zero; Vector2 max = canvasSize; var isOverlay = canvas.renderMode == RenderMode.ScreenSpaceOverlay; var noCamera = canvas.renderMode == RenderMode.ScreenSpaceCamera && canvas.worldCamera == null; if (isOverlay || noCamera) { result = screenPosition; } else { var ray = canvas.worldCamera.ScreenPointToRay(screenPosition); var plane = new Plane(canvasRect.forward, canvasRect.position); float distance; plane.Raycast(ray, out distance); result = canvasRect.InverseTransformPoint(ray.origin + (ray.direction * distance)); min = -Vector2.Scale(max, canvasRect.pivot); max = canvasSize - min; } result.x = Mathf.Clamp(result.x, min.x, max.y); result.y = Mathf.Clamp(result.y, min.x, max.y); return result; } /// /// Determines if slider is horizontal. /// /// true if slider is horizontal; otherwise, false. /// Slider. public static bool IsHorizontal(Slider slider) { return slider.direction == Slider.Direction.LeftToRight || slider.direction == Slider.Direction.RightToLeft; } /// /// Determines if scrollbar is horizontal. /// /// true if scrollbar is horizontal; otherwise, false. /// Scrollbar. public static bool IsHorizontal(Scrollbar scrollbar) { return scrollbar.direction == Scrollbar.Direction.LeftToRight || scrollbar.direction == Scrollbar.Direction.RightToLeft; } /// /// Get graphic component from TextAdapter. /// /// Adapter. /// Graphic component. public static Graphic GetGraphic(TextAdapter adapter) { return (adapter != null) ? adapter.Graphic : null; } } }