UGUI Canvas 移动Canvas的子对象到屏幕坐标 CanvasScaler在Scale With Screen Size模式Canvas实际大小的计算方法
CanvasScaler在Scale With Screen Size模式Canvas实际大小的计算方法:
using UnityEngine;
public class TestCanvasScaler:MonoBehaviour{
private void Start(){
Vector2 sreenSize=new Vector2(800,480);//实际分辨率
Vector2 referenceResolution=new Vector2(960,640);//设计分辨率
float matchWidthOrHeight=0.6f;
float a = Mathf.Log(sreenSize.x/referenceResolution.x,2f);
float b = Mathf.Log(sreenSize.y/referenceResolution.y,2f);
float p = Mathf.Lerp(a,b,matchWidthOrHeight);
float scaleFactor=Mathf.Pow(2f,p);//得到Canvas.scaleFactor
Vector2 realSize=sreenSize/scaleFactor;//Canvas实际大小
Debug.LogFormat("width:{0}, height:{1}",realSize.x,realSize.y);//width:1022.647, height:613.5882
}
}
移动Canvas的子对象到屏幕坐标
using UnityEngine;
using UnityEngine.UI;
public class MoveCanvasChildToScreenPos:MonoBehaviour{
private Canvas m_canvas;
private RectTransform m_rectTransform;//需要移动的Canvas子对象的RectTransform组件
private void Awake(){
m_canvas=GetComponentInParent<Canvas>();
m_rectTransform=GetComponent<RectTransform>();
}
private void Update(){
MoveToScreenPos(m_rectTransform,Input.mousePosition,m_canvas);
}
/*private void MoveToScreenPos(RectTransform rectTransform,Vector2 screenPos, Canvas canvas){
if(rectTransform.anchorMin!=Vector2.zero && rectTransform.anchorMax!=Vector2.zero){
Debug.LogError("Error:使用此方法时anchorMin和anchorMax必须都为0");
}
screenPos/=canvas.scaleFactor;//计算屏幕在Canvas实际大小中的位置
screenPos-=rectTransform.rect.size*0.5f;//以中心为枢轴
Vector2 offset=screenPos-rectTransform.offsetMin;
//offsetMin:表示RectTransform框的左下角减去anchorMin位置的值(像素为单位)。
//offsetMax:表示RectTransform框的右上下角减去anchorMax位置的值(像素为单位)。
rectTransform.offsetMin=screenPos;
rectTransform.offsetMax+=offset;
}*/
private void MoveToScreenPos(RectTransform rectTransform,Vector2 screenPos, Canvas canvas){
float scaleFactor=canvas.scaleFactor;
Vector2 screenSize=new Vector2(Screen.width,Screen.height);
screenPos/=scaleFactor;//计算屏幕在Canvas实际大小中的位置
screenPos-=rectTransform.rect.size*0.5f;//以中心为枢轴
Vector2 realSize=screenSize/scaleFactor;//Canvas实际大小(像素为单位)
Vector2 anchorMinPos=realSize*rectTransform.anchorMin;//anchorMin在Canvas实际大小中的位置(像素为单位)
Vector2 anchorMaxPos=realSize*rectTransform.anchorMax;//anchorMax在Canvas实际大小中的位置(像素为单位)
Vector2 leftBottomPos=anchorMinPos+rectTransform.offsetMin;//RectTransform框的左下角在Canvas实际大小中的位置(像素为单位)
Vector2 rightTopPos=anchorMaxPos+rectTransform.offsetMax;//RectTransform框的右上角在Canvas实际大小中的位置(像素为单位)
Vector2 offset=screenPos-leftBottomPos;
//offsetMin:表示RectTransform框的左下角减去anchorMin位置的值(像素为单位)。
//offsetMax:表示RectTransform框的右上下角减去anchorMax位置的值(像素为单位)。
rectTransform.offsetMin+=offset;
rectTransform.offsetMax+=offset;
}
/*private void MoveToRealPos(RectTransform rectTransform,Vector2 realPos){
if(rectTransform.anchorMin!=Vector2.zero && rectTransform.anchorMax!=Vector2.zero){
Debug.LogError("Error:使用此方法时anchorMin和anchorMax必须都为0");
}
realPos-=rectTransform.rect.size*0.5f;//以中心为枢轴
Vector2 offset=realPos-rectTransform.offsetMin;
rectTransform.offsetMin=realPos;
rectTransform.offsetMax+=offset;
}*/
}