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;
}
}
}