常见问题
问题1:导入后界面显示2遍UI
解决方法:
Main Camera
的 Camera
组件中的 Culling Mask
去掉 UI
的对号
问题2:设置分辨率
解决方法:
- 添加
UI Content Scaler
组件 Scale Mode
选择Scale with Screen Size
- 设置X Y
问题3: 点击UI穿透
https://www.fairygui.com/docs/guide/unity/input.html
如果要区分点击UI还是点击场景里的对象,可以使用下面的方法:
if(Stage.isTouchOnUI) //点在了UI上
{
}
else //没有点在UI上
{
}
这种检测不仅适用于点击,也适用于悬停。例如,如果鼠标悬停在UI上,这个判断也是真。如果你觉得屏幕上都没有UI了这个还是返回真,那就真的是有UI,特别是全屏界面,没设置穿透时,它的空白区域也是接受输入的。你可以通过打印GRoot.inst.touchTarget检查。
问题4: 适配后坐标乱
如果要获得任意一个UI元件在屏幕上的坐标,可以用:
Vector2 screenPos = aObject.LocalToGlobal(Vector2.zero);
相反,如果要获取屏幕坐标在UI元件上的局部坐标,可以用: 如果有UI适配导致的全局缩放,那么逻辑屏幕大小和物理屏幕大小不一致,逻辑屏幕的坐标就是GRoot里的坐标。如果要进行局部坐标与逻辑屏幕坐标的转换,可以用:
//物理屏幕坐标转换为逻辑屏幕坐标
Vector2 logicScreenPos = GRoot.inst.GlobalToLocal(screenPos);
//UI元件坐标与逻辑屏幕坐标之间的转换
aObject.LocalToRoot(pos);
aObject.RootToLocal(pos);
注意,我们在编辑器里定义的,代码里处理的,一般就是指这个逻辑屏幕坐标。
如果要转换任意两个UI对象间的坐标,例如需要知道A里面的坐标(10,10)在B里面的位置,可以用:
Vector2 posInB = aObject.TransformPoint(new Vector2(10,10), bObject);
问题5: UI 的层级显示不正确
调整 sortingOrder
属性