欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

unity UGUI之获取UI子节点在Canvas的2D坐标(一)

程序员文章站 2022-04-03 16:51:53
...

在做unityUGUI时,经常会遇到屏幕坐标转换为ugui坐标,前段时间项目需求鼠标点击屏幕遥杆就在手指点击的位置,会有屏幕左边转化为UGUI坐标来实现,今天想大家分享一下坐标转换,这段时间主要是对UGUI问题以及优化进行详解。如下图所示,UI比较复杂了子节点会很多,假设我想获取某个子的子节点的2D坐标。unity UGUI之获取UI子节点在Canvas的2D坐标(一)

首先我们要搞清楚 transform.postion 和 rectTransform.anchoredPosition  这两个坐标是完全不一样的。前面的是3D坐标,后面的是2D在Rect里的坐标,并且还是相对坐标,那么节点深了坐标就更不好换算了。

public Canvas canvas;
void Start()
{
	Vector2 pos;
	if(RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, transform.position, canvas.camera, out pos))
    {
		Debug.Log(pos);
	}
 
}

所以上述代码就是用UI元素的世界坐标和canvas的RectTrasform再加上UI摄像机,换算出元素在Canvas的2D坐标

最后在想需要赋值的UI 用 rectTransform.anchoredPosition = pos 就可以了。。

今天有朋友问我,怎么通过鼠标的坐标在屏幕上移动来更新UI的显示位置。代码如下

using UnityEngine;
using System.Collections;
 
public class NewBehaviourScript : MonoBehaviour {
 
    Canvas canvas;
    RectTransform rectTransform;
	// Use this for initialization
	void Start () 
    { 
        rectTransform = transform as RectTransform;
        canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
	}
	
	// Update is called once per frame
	void Update () {
        Vector2 pos;
        if(RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, Input.mousePosition, canvas.worldCamera, out pos)){
            rectTransform.anchoredPosition = pos;
        }
	}
}

实现项目的最重要的逻辑如下:

        if (Input.GetMouseButton(0))
        {
            Vector2 uguiPos;
            pressing = true;
            pos = Input.mousePosition ;
            RectTransformUtility.ScreenPointToLocalPointInRectangle
            (GameEntry.GameSceneManager.uiCanvasRectTransform, pos,
            GameEntry.GameSceneManager.uiCamera, out uguiPos);
            pos = uguiPos;
            //pos = Vector3.Scale( uiCanvas.worldCamera.ScreenToViewportPoint(pos), screenSize ) - screenSize * 0.5f;
            if (PlayerMainAction.moveStart != null) PlayerMainAction.moveStart();
        }

 

相关标签: unity UGUI