制作项目时遇到的问题,最开始使用Camera.main.WorldToScreenPoint 这个函数时,期望返回屏幕坐标以应用到RectTransform,使指定UI显示到屏幕指定位置。然而实际测试时发现该函数返回的ScreenPosition是Overlay状态下UI面板的坐标。该坐标仅适用于Canvas的RenderMode设置为Screen Space - Overlay的情况。
如果用于设置的UI其归属的Canvas组件的RenderMode设置为Screen Space - Camera或者是 World Space,则上述函数得到的结果应用在Rect Transform中会得到x与y值为几十万的情况,导致在Game视口中并看不到对应的UI。并不是操作没有生效,而是这个UI的位置离相机十万八千里。
经过测试后直接将UI组件对应的GameObject的transform.position设置为Raycast获取的World Space坐标即可应用正确的值到Rect Transform中。
 
正确做法:
  • 对于不需要跟随3D场景中对象进行位置设置的UI,使用Overlay模式,以确保其Rect Transform数据跟随屏幕像素
  • 对于需要跟随3D场景中对象进行位置设置的UI(如交互、血条等),使用ScreenSpace - Caemra或World Space,将Plane Distance调整至近相机的值(比如值调整为1),然后使用WorldSpace的坐标进行赋值
 
3Ds Max制作模型进入Unity后顶点数量变多Volumetric Light Beam源码笔记(一)- 总览