[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)

因为我是打包到手机端,并且使用的是前置摄像头

在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的宽度会根据我们设置的适配模式自行适配宽高值,具体怎么算的,我没有深究到底了)。

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第1张图片
摄像机的照到的范围:看下图,其实简单来说就是在矩形之前的物体可以投影到屏幕上,我们也就能看到。

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第2张图片

 对于屏幕的更改,则意味着物体的投影屏幕变小。

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第3张图片

 对于Canvas的z值,我们其实通过Canvas的Plane Distance来进行更改。

我这里的摄像机世界坐标为(0,0,0)

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第4张图片

 Cube的世界坐标为:(0,0,10)

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第5张图片

 [Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第6张图片

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第7张图片

 其实更改到15依然可以看见Canvas,但是当我们将数值改为20时,便不再出现canvas的内容

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第8张图片

 此时我们便可以获取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;
          
    }

运行截图如下:

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第9张图片

 拖动Game下的屏幕,便可以得到实时的屏幕坐标

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第10张图片

并且值得注意的是,当打包到手机上,我的文本和button都是反着的,因此我修改了两个UI组件的旋转角度。

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)_第11张图片

 在电脑端我是这样显示的,手机端显示就是正的了。

如有错误,欢迎指正。

你可能感兴趣的:(Unity,unity)