Skip to main content

常见问题

问题1:导入后界面显示2遍UI

解决方法:

Main CameraCamera 组件中的 Culling Mask 去掉 UI的对号

问题2:设置分辨率

解决方法:

  1. 添加 UI Content Scaler 组件
  2. Scale Mode 选择 Scale with Screen Size
  3. 设置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 属性