unity3duGUI中世界坐标与屏幕坐标实际运用-创新互联

uGUI中我们首先需要选择一种Canvas的渲染模式,包括Screen Space - Overlay,Screen Space - Camera和World Space。

渭南网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

Screen Space - Overlay

在该模式下,世界坐标(transform.Position)和屏幕坐标是重合的,即左下为(0,0),右上为(screen.width,screen.height).因此,在该模式下进行屏幕相关的操作时非常方便的。

Screen Space - Camera

在没有设置Camera时,它和Screen Space - Overlay是一样的。

在设置了Camera时,世界坐标(transform.Postion)和它的Camera相关,在正交相机投影时与Size有关;在透视投影时与FOV和Plane Distance相关,具体参见

http://quick007.blog.51cto.com/7454007/1767700

很多时候我们需要对屏幕坐标进行操作,比如处理鼠标或者touch输入还有就是我们需要计算UI是否超出屏幕边框,来计算UI的显示位置。

我们这里以计算UI显示位置为例,首先我们需要得到UI在屏幕中的位置使用世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);来得到对应的屏幕坐标,然后需要得到UI的大小使用rect transform获得rect的width和height,注意,该width和height可能并不是UI相对于屏幕的宽和高,因为该值uGUI是根据Canvas的的宽高进行计算的。我们需要对width和height都乘以Canvas.scaleFactor来获得相对于屏幕分辨率的UI大小。(该计算同样适用于Screen Space - Overlay)

现在我们已获取到UI的位置和大小,接下来就可以根据它们来计算UI是否超出屏幕来调整UI的位置。

最后,将计算得到的UI屏幕坐标转换为世界坐标赋值给transform.Position.

屏幕坐标→世界坐标:camera.ScreenToWorldPoint(transform.position);

注意,该模式下会对动态脚本生成的UI组件进行LocalScale设置,需要你设置setParent后把它重置为Vector3.one,不然UI的大小可能不是你预期的。比如,在正交投影下,camera的 size为5,canvas的heitht为1000, 那么scale会被自动设置为height/(size*2)即100.至于为什么unity会这样做,不是很清楚,望知道的大虾不啬赐教。

World Space

该模式没有研究过,暂不讨论。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:unity3duGUI中世界坐标与屏幕坐标实际运用-创新互联
链接URL:http://pwwzsj.com/article/deeijj.html