Unity世界坐标转换屏幕坐标(概览)

        这些天做的项目中,有一个世界坐标转换屏幕坐标的功能,具体需求如下

        在3d场景中,部分物体可以进行点击交互,如果某个物体可以点击,就在屏幕上对应位置,添加一个Button,也就是把场景中物体的坐标转换到屏幕上,并添加对应的UI元素。

        经过多次测试,我发现影响坐标转换的无非是以下几点:

1.游戏中的Canvas的模式

通常我们可能会选用两种模式

(1)如果一个Canvas只需要显示UI,不需要屏幕后处理效果,那么我们就会选用Overlay

  

(2)如果一个Canvas需要添加后处理效果,比如高斯模糊等,那么就需要把对应Canvas的RenderMode设置为Camera,并指定对应的UI摄像机(对于UI和场景摄像机的分离会在以后的文章中详细介绍)

2.游戏中Canvas Scaler的Resolution和Match

通常我们会把Resolution设置为UI开发时美术部门提供的效果图尺寸,也就是是基础真机分辨率,在UI中我们称它为参考分辨率,同时将Match设置为0,

上图中match width or height指的是在我们的屏幕分辨率出现变化时,我们基于宽度还是高度对Canvas进行适配,如果设置为0,则宽度为参考分辨率的宽度,高度为参考屏幕分辨率宽度和当前分辨率宽度的比值倍的当前分辨率高度(即 Screen.height * ScreenBaseSize.width / Screen.width),设置为1时使用同样的逻辑计算,只不过选择高度作为基准

3.进行坐标转换时使用的函数

// 转换为屏幕坐标
Camera.main.WorldToScreenPoint(target.transform.position)
// 转换为视口坐标
Camera.main.WorldToViewportPoint(target.transform.position)

 借鉴一下百度上的解释

(1)屏幕坐标系 Screen Space
屏幕坐标系是建立在屏幕上的二维坐标系,以像素来定义的,屏幕的左下角为(0,0),右上角为(Screen.width, Screen.height),z轴的坐标是相机的世界坐标中z轴坐标的负值。

鼠标位置坐标属于屏幕坐标,通过Input.mousePosition可以获得该位置的坐标。

手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得手指触摸屏幕时手指的坐标。

(2)视口坐标系 ViewPort Space
视口坐标系是将Game视图的屏幕坐标系单位化,左下角(0,0),右上角(1,1)。z轴的坐标是相机的世界坐标中z轴坐标的负值。

4.使用的终端

测试发现,对于Editor和PC,在修改分辨率时,会出现不同的错误和位置偏移,展现的错误效果与上述三点有关,需要对坐标进行不同方式的转换,才能计算出最终的位置。而且在PC下,使用可变分辨率和全屏也会展现不同的效果。

以上就是世界坐标系下的坐标转换屏幕坐标时出现的问题,具体的解决方案,会在未来的文章中进行详细分析,谢谢观看~

  贴一下其余几篇文章,方便大家阅读。

Unity世界坐标转换屏幕坐标(详解)_Unity鼓励师的博客-CSDN博客_unity 世界坐标转屏幕坐标

Unity世界坐标转换屏幕坐标(测试)_Unity鼓励师的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/HelloCSDN666/article/details/124190781