using System.Collections; using UnityEngine; namespace YKMoon { public static partial class YKRectTransformUtility { /// /// Set Pivot without change position. /// /// /// public static void SetPivot(this RectTransform target, Vector2 pivot) { var offset = pivot - target.pivot; offset.Scale(target.rect.size); var wordlPos = target.position + target.TransformVector(offset); target.pivot = pivot; target.position = wordlPos; } public static void SetAnchor(this RectTransform rectTransform, TextAnchor anchor) { switch(anchor) { case TextAnchor.UpperLeft: rectTransform.anchorMin = new Vector2(0, 1f); rectTransform.anchorMax = new Vector2(0, 1f); rectTransform.pivot = new Vector2(0, 1f); break; case TextAnchor.UpperCenter: rectTransform.anchorMin = new Vector2(0.5f, 1f); rectTransform.anchorMax = new Vector2(0.5f, 1f); rectTransform.pivot = new Vector2(0.5f, 1f); break; case TextAnchor.UpperRight: rectTransform.anchorMin = new Vector2(1f, 1f); rectTransform.anchorMax = new Vector2(1f, 1f); rectTransform.pivot = new Vector2(1f, 1f); break; case TextAnchor.MiddleLeft: rectTransform.anchorMin = new Vector2(0f, 0.5f); rectTransform.anchorMax = new Vector2(0f, 0.5f); rectTransform.pivot = new Vector2(0f, 0.5f); break; case TextAnchor.MiddleCenter: rectTransform.anchorMin = new Vector2(0.5f, 0.5f); rectTransform.anchorMax = new Vector2(0.5f, 0.5f); rectTransform.pivot = new Vector2(0.5f, 0.5f); break; case TextAnchor.MiddleRight: rectTransform.anchorMin = new Vector2(1f, 0.5f); rectTransform.anchorMax = new Vector2(1f, 0.5f); rectTransform.pivot = new Vector2(1f, 0.5f); break; case TextAnchor.LowerLeft: rectTransform.anchorMin = new Vector2(0f, 0f); rectTransform.anchorMax = new Vector2(0f, 0f); rectTransform.pivot = new Vector2(0f, 0f); break; case TextAnchor.LowerCenter: rectTransform.anchorMin = new Vector2(0.5f, 0f); rectTransform.anchorMax = new Vector2(0.5f, 0f); rectTransform.pivot = new Vector2(0.5f, 0f); break; case TextAnchor.LowerRight: rectTransform.anchorMin = new Vector2(1f, 0f); rectTransform.anchorMax = new Vector2(1f, 0f); rectTransform.pivot = new Vector2(1f, 0f); break; } } /// /// Add child(RectTransform) to this RectTransform. /// /// a child typeof RectTransform. public static void AddChild(this RectTransform rectTransform, RectTransform child) { rectTransform.AddChild(child); child.anchoredPosition = Vector2.zero; } /// /// 用来重置ScrollView的滚动位置 /// /// 对应ScrollView的content public static void ResetScroll(this RectTransform content) { content.anchoredPosition = Vector2.zero; } /// /// World position to ugui position. /// /// /// /// /// public static Vector2 WorldToUGUIPosition(RectTransform canvasRectTransform, Camera camera, Vector3 worldPosition) { //世界坐标-〉ViewPort坐标 Vector2 viewPos = camera.WorldToViewportPoint(worldPosition); //ViewPort坐标-〉UGUI坐标 return new Vector2(canvasRectTransform.rect.width * viewPos.x, canvasRectTransform.rect.height * viewPos.y); } /// /// World deltasize to ugui size. /// /// /// /// /// public static Vector2 WorldDeltaToUGUISize(RectTransform canvasRectTransform, Camera camera, Vector3 delta) { var posA = WorldToUGUIPosition(canvasRectTransform, camera, Vector3.zero); var posB = WorldToUGUIPosition(canvasRectTransform, camera, delta); return posB - posA; } /// /// Relative anchord pos between to rect transform. /// /// /// /// public static Vector2 GetRelativeAnchoredPos(RectTransform from, RectTransform to) { Vector2 localPoint; Vector2 fromPivotDerivedOffset = new Vector2(from.rect.width * from.pivot.x + from.rect.xMin, from.rect.height * from.pivot.y + from.rect.yMin); Vector2 screenP = RectTransformUtility.WorldToScreenPoint(null, from.position); screenP += fromPivotDerivedOffset; RectTransformUtility.ScreenPointToLocalPointInRectangle(to, screenP, null, out localPoint); Vector2 pivotDerivedOffset = new Vector2(to.rect.width * to.pivot.x + to.rect.xMin, to.rect.height * to.pivot.y + to.rect.yMin); return to.anchoredPosition + localPoint - pivotDerivedOffset; } } }