因为我是打包到手机端,并且使用的是前置摄像头
在Canvas默认的render mode(Screen Space - Overlay)下:
我想要使用 arcamera.WorldToScreenPoint(button.transform.position)
将Canvas下的button世界坐标转为屏幕坐标,但是结果显示总是不怎么对。
解决方法:
将Canvas里的render mode改为Screen Space - Camera,并将自己的camera赋值给它即可。
Canvas将覆盖整个场景,此时无法更改Canvas的transform组件的信息(那个地方已经灰掉)
如何覆盖的呢,其实就是Canvas的宽和高变成了屏幕的宽和高( canvas的宽度会根据我们设置的适配模式自行适配宽高值,具体怎么算的,我没有深究到底了)。
摄像机的照到的范围:看下图,其实简单来说就是在矩形之前的物体可以投影到屏幕上,我们也就能看到。
对于屏幕的更改,则意味着物体的投影屏幕变小。
对于Canvas的z值,我们其实通过Canvas的Plane Distance来进行更改。
我这里的摄像机世界坐标为(0,0,0)
Cube的世界坐标为:(0,0,10)
其实更改到15依然可以看见Canvas,但是当我们将数值改为20时,便不再出现canvas的内容
此时我们便可以获取button的屏幕坐标了
private void Update()
{
log.text = "" + Screen.width + "X" + Screen.height;
log.text += "\nbutton's world position:" + button.transform.position;
Vector2 button_ScreenPosition = arcamera.WorldToScreenPoint(button.transform.position);
log.text += "\nbutton's screen position" + button_ScreenPosition;
Vector2 objScreenPosition = arcamera.WorldToScreenPoint(_obj1.transform.position);
update_log.text = "\ncube's Screen position:" + objScreenPosition;
}
运行截图如下:
拖动Game下的屏幕,便可以得到实时的屏幕坐标
并且值得注意的是,当打包到手机上,我的文本和button都是反着的,因此我修改了两个UI组件的旋转角度。
在电脑端我是这样显示的,手机端显示就是正的了。
如有错误,欢迎指正。