Unity UI 局部坐标转屏幕坐标

本文介绍了一个Unity游戏开发中的实用脚本,通过GetScreenCoordinates方法获取RectTransform组件的世界坐标,并应用于UI元素的位置调整。作者详细展示了如何计算屏幕坐标并进行调试输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

using UnityEngine;

public class GetScreenCoordinatesTest : MonoBehaviour
{
    public GameObject obj;
    // Start is called before the first frame update
    void Start()
    {
        Rect rect = GetScreenCoordinates(transform.GetComponent<RectTransform>());
        obj.transform.position = new Vector3(rect.x, rect.y,obj.transform.position.z);
    }
    public Rect GetScreenCoordinates(RectTransform uiElement)
    {
        var worldCorners = new Vector3[4];
        uiElement.GetWorldCorners(worldCorners);
        var result = new Rect(
                      worldCorners[0].x + (worldCorners[2].x - worldCorners[0].x)/2,
                      worldCorners[0].y + (worldCorners[2].y - worldCorners[0].y)/2,
                      worldCorners[2].x - worldCorners[0].x,
                      worldCorners[2].y - worldCorners[0].y);

        Debug.Log(result);
        return result;
    }

}

### 将 Unity UI 坐标换为屏幕坐标Unity 中,为了将 UI 的 `RectTransform` 坐标(即 UGUI 坐标换为屏幕坐标,可以利用 `RectTransformUtility.ScreenPointToLocalPointInRectangle` 和 `Camera.WorldToScreenPoint` 方法间接实现这一过程。然而更直接的方法是使用 `RectTransformUtility.RectangleToWorldPoint` 或者反向思维先获得本地坐标再映射到屏幕坐标。 对于具体的实现逻辑如下: 当处理 UI 元素时,通常这些元素位于 Canvas 下面,并且其位置由 RectTransform 控制[^2]。因此,要从 UI 坐标得到屏幕坐标,可以通过以下 C# 脚本完成此操作: ```csharp using UnityEngine; public class UIToScreenConverter : MonoBehaviour { public RectTransform uiElement; private Camera mainCam; void Start() { mainCam = Camera.main; } /// <summary> /// Converts a point from the given RectTransform's local space to screen space. /// </summary> /// <param name="rectTransform">The RectTransform whose coordinates will be converted.</param> /// <returns>The position of the RectTransform in screen space as Vector2.</returns> public Vector2 ConvertUiLocalPointToScreenSpace(RectTransform rectTransform) { Vector3 worldCornerPoints = new Vector3(); // Get corners relative to parent and convert them into world points rectTransform.GetWorldCorners(new Vector3[4]); var centerWorldPos = (rectTransform.transform.TransformPoint(rectTransform.rect.center)); // Then transform this world position back into screen space return mainCam.WorldToScreenPoint(centerWorldPos); } } ``` 上述代码定义了一个名为 `ConvertUiLocalPointToScreenSpace` 的函数,该函数接收一个 `RectTransform` 参数并返回对应的屏幕空间中的二维矢量表示形式。这里的关键在于首先获取 UI 组件的世界坐标,然后再将其换为屏幕坐标[^1]。 需要注意的是,在某些情况下可能还需要考虑摄像机视角的影响以及 Canvas 渲染模式的不同设置(如 Screen Space - Overlay vs. Screen Space - Camera),这可能会稍微改变实际应用中的具体做法[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值