UGUI 移动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("{0}, height:{1}",realSize.x,realSize.y);//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;
	}*/

}
原文地址:https://www.cnblogs.com/kingBook/p/12581998.html