admin管理员组

文章数量:1611159

在学习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坐标与游戏坐标的转换,还有一个要注意就是UI的分辨率与Game预览窗口的分辨率

或者

  • 详解RectTransformUtility与Camera.main中的坐标转换方法

Camera.main中也有 一些坐标转换方法,但是参数明显没有RectTransformUtility多。仔细研究不难发现,在Camera的坐标转换方法中,主要缺少了camera,recttransform 这样两个参数。在坐标的转换中并不是不需要这两个参数,相反很重要。但是Camera中的方法不需要是因为Camera方法中已经默认了这俩个参数。camera默认为 Camera.main,而recttransform默认为这个摄像机屏幕的矩形(Rect)。所以使用Camera的进行的坐标转换有些时候是与RectTransformUtility的结果不一样的。

但就拿RectTransformUtility来说,它里面的recttransform 参数我们通常是设为Canvas的recttransform。因为我们的UI都是要排布在Canvas的矩形窗口中,然后如果Canvas的模式选择为Camera的话,我们另一个camera参数也要设置成渲染这个UI界面的相机。可以这样理解,我们转换屏幕坐标,首先得知道我的新坐标对应的物体是要用什么摄像机渲染出来,然后这个新物体是对应的哪个矩形窗口坐标系,只有 标明了这两个东西,我们才能最终确定准确的屏幕坐标。

  • Input中的position

MousePosition:鼠标的位置,返回的是mouse的屏幕坐标。

本文标签: 坐标标的详解UnityMousePosition