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("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;
	}*/

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章