• 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;
    	}*/
    
    }
    
  • 相关阅读:
    探讨.net Socket支持在线连接数量
    Net Configuration Agent
    Http压力测试工具HttpTest4Net
    TCP连接有效性检测方法
    SocketAsyncEventArgs使用解说
    可靠、高吞吐架构基础改造
    PerformanceCounter蛋痛的设计
    谱聚类(spectral clustering)原理总结
    用scikit-learn学习DBSCAN聚类
    DBSCAN密度聚类算法
  • 原文地址:https://www.cnblogs.com/kingBook/p/12581998.html
Copyright © 2020-2023  润新知