项目中,经常会用到将3D场景中的物体坐标转换到屏幕坐标,然后设置UI在转换后的位置上。
一、Camera.WorldToScreenPoint
官方的描述是:Transforms position from world space into screen space.
Screenspace is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight). The z position is in world units from the camera.
这里要明确的是,通过该方法获得的是屏幕坐标,比如设备是1080 x 1920的分辨率,那么转换后的坐标范围就是从屏幕左下角 (0, 0) 点到屏幕右上角 (1080, 1920)的。但是这个转换后的坐标是不是可以直接赋值给Canvas上的组件使用,那就需要依Canvas的情况而定了,尤其需要做自适应适配时,不同分辨率适配,位置计算需要注意。
这里先介绍下Canvas的组件Canvas Scaler,分辨率自适应神器。通常情况下,UI Scale Mode不同,处理方式也不同。这里暂时只讨论 Scale With Screen Size,这是最常用的一种自适应适配模式,下面会要求填入Reference Resolution(参考分辨率),屏幕的匹配模式Screen Match Mode一般选择Match Width Or Height。width和height设置权重来调节影响比例模式。如下图所示,参考分辨率是1080 x 1920,屏幕分辨率也是1080 x 1920。
举个例子:如参考分辨率设置为1080 x1920, Match设为0,即根据宽度来适配,当屏幕分辨率设置为1536 x 2048时,画布的宽和高也被适配成了1080 x 1440, (即以宽为原则,高等比缩放, 1080 / 1536 x 2048 ,1080 x 1440就是经过Canvas Scaler处理过的宽和高)。反之Match设为1,那便根据高度来适配。如下图所示。
再说回WorldToScreenPoint ,通过它转换出的坐标是基于屏幕分辨率的,那么想要转换成Canvas上的坐标,由于Canvas Scaler的影响,就需要进一步计算,而计算所用的宽和高,就不能用参考分辨率的,要是用经过Canvas Scaler处理过的宽和高。处理如下: