Unity坐标——Unity中各种坐标的详解 MousePosition RectTransform.AnchoredPostion Position LocalPosition之间的解释

在学习Unity的过程中,我原先一直只关注 WorldPositon 、 LocalPosition。即世界坐标和本地坐标。一个是世界的绝对坐标,一个是相对父对象的相对坐标。

但是现在我也要开始注意第三种坐标,叫做屏幕坐标。屏幕坐标就是在屏幕上表现的坐标。如果是一个1920*1080的屏幕,那么他的左下角就是(0,0)   右上角就是(1920,1080)。在代码中,Input.MousePostion返回的就是屏幕坐标。

要注意的是,这个屏幕坐标是和相机有关的。你的相机有一个矩形的窗口,这个窗口中的物体就会被相机捕捉然后渲染到游戏窗口。如果是多个相机,那么屏幕坐标之间的转换就会变得比较复杂,我还没搞懂。目前我做的实验全部都是使用一个游戏主相机。

 

  • UI中RectTransform

首先要知道,RectTransform是UI系统对Unity传统的Transform组件进行的一个拓展,所以原有的Transform的一些属性方法在RectTransform中也是可以访问到的。

RectTransform的position有如下三个

anchoredPosition :这个是自己的recttransform中设置的anchor与pivot的相对位置

localPosition:这个在recttransform中就等于anchoredPosition 。 这两种坐标要学会使用。 

position:这个就是recttransform的屏幕坐标。它的好处就是可以无视UI窗口的父子关系所产生的相对坐标,这个是一个相对于屏幕的绝对坐标。所以如果想要简单实现一些UI位置变化,那么这个坐标十分好用。通常是将游戏中的世界坐标转换成一个屏幕坐标,再把 这个屏幕坐标赋值给 UI的position。如RectTransformUtility.WorldPositionToScreenPositonInRectTransform。这个就是RectTransform自带的工具类,我们可以用里面的静态方法简单的实现一些坐标的转换。

关于UI坐标与游戏坐标的转换,还有

### 如何在 Unity 中将 RectTransform 转换为屏幕坐标 为了实现从 `RectTransform` 到屏幕坐标的转换,在 Unity 中可以利用 `Camera.WorldToScreenPoint()` 方法来处理世界坐标到屏幕坐标的转变,但对于 UI 元素来说更常用的是通过 `RectTransformUtility.ScreenPointToLocalPointInRectangle` 或者直接使用 `RectTransform.rectTransform.position` 结合摄像机的相关属性来进行变换。 当涉及到具体的 UI 坐标转换时,特别是对于基于 Canvas 的 UI 组件而言,应该考虑如下方式: 给定一个 `RectTransform` 对象,可以通过下面的方法将其位置转换成屏幕空间中的点。需要注意的是,此过程可能依赖于特定的 Canvas 设置(如渲染模式、挂载的相机等),因此确保这些设置已经按照需求配置好[^1]。 ```csharp using UnityEngine; public class UiCoordinateConverter : MonoBehaviour { public Camera uiCamera; private RectTransform rectTransform; void Start() { rectTransform = GetComponent<RectTransform>(); } Vector2 ConvertRectTransfromPositionToScreenSpace(){ Vector3 positionOnScreen = uiCamera.WorldToScreenPoint(rectTransform.localPosition); // 如果需要调整Y轴方向, 可能还需要做一些额外的操作. return new Vector2(positionOnScreen.x, Screen.height - positionOnScreen.y); } } ``` 上述代码片段展示了如何定义一个简单的脚本来执行这一操作。这里假设有一个名为 `uiCamera` 的公共变量用于指定负责绘制该 UI 层级结构的摄像机实例;而 `rectTransform` 是目标 UI 控件自身的矩形变换组件。函数 `ConvertRectTransfromPositionToScreenSpace` 实现了核心逻辑——它接收当前对象的位置并返回其对应的屏幕坐标[^2]。 然而,如果希望得到更加精确的结果,尤其是针对不同锚定点的情况,则推荐采用官方提供的工具类 `RectTransformUtility` 来辅助完成这项工作。这不仅简化了许多边界情况下的处理难度,而且提高了代码可读性和维护性[^3]。 ```csharp if (RectTransformUtility.ScreenPointToWorldPointInRectangle( sourceRectTransform, Input.mousePosition, null, out var worldPos)) { Debug.Log($"World Position: {worldPos}"); } else { Debug.LogError("Failed to convert screen point to world point."); } ``` 这段代码尝试把鼠标指针所在的屏幕位置映射回某个具体 `sourceRectTransform` 所处的世界坐标系内的一点,并打印出来供调试查看。请注意这里的第三个参数传入了一个 `null` 表示默认会查找最近的有效摄像机作为参照物。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值