NGUI怎样做pc端的屏幕自适应
在使用Unity进行项目开发时,90%的项目都会选用NGUI。NGUI作为一款较为成熟的UI插件,尽管存在一些问题,但众多游戏都在使用,足以证明它能够胜任相关工作。本文将详细介绍如何实现UI和3D游戏的自适应。
1. 获取屏幕的宽高
Screen.width 和 Screen.height 可用于获取设备屏幕的宽高,但这并非NGUI的宽高。例如,若要创建一个全屏的 UISprite,以下代码是错误的:
sprite.width = Screen.width;
sprite.height = Screen.height;
正确的做法如下:
UIRoot root = GameObject.FindObjectOfType<UIRoot>();
if (root != null) {
float s = (float)root.activeHeight / Screen.height;
int height = Mathf.CeilToInt(Screen.height * s);
int width = Mathf.CeilToInt(Screen.width * s);
Debug.Log("height = " + height);
Debug.Log("width = " + width);
}
建议在项目中封装两个只读方法来获取NGUI的宽和高,这样可以提高代码的复用性和可维护性。
2. 自适应NGUI屏幕
2.1 UI Root (2D) 属性设置
在Hierarchy视图中选择 UI Root (2D),然后在Inspector视图中进行如下设置:
- Scaling Style:如果是手机游戏,可选择
FixedSizeOnMobiles,此选项开启了UI整体缩放的支持。 - Manual Height:该属性至关重要,屏幕自适应的原理是依据
Screen.width和Screen.height动态计算实际高度,并动态修改此值。 - Min/Max inum Height:这是支持的最大和最小高度,一般范围是640到1536。
2.2 定制屏幕分辨率
开始制作UI时,需要定制游戏主版本的屏幕分辨率。假设我们设定的分辨率是960X640,那么屏幕的实际高度为640,此时 Manual Height 参数应设置为640。
2.3 不同分辨率下的调整
在960X640的屏幕上布置简单界面后,若将屏幕分辨率改为1024X768(960X640是3:2的屏幕,1024X768是4:3的屏幕),界面会发生变化。此时,需要修改 Manual Height 参数。对于1024X768的分辨率,Manual Height 应为720。
实际上,并不存在完美的自适应方法,除非能接受屏幕上某些元素被拉伸变形。例如,可将背景的白框拉伸至屏幕的宽高。这其实是一个简单的数学算法,根据布置UI时的分辨率和当前屏幕分辨率,动态计算出 manualHeight 的值。
在Unity圣典上有人已经实现了该算法,可在合适的位置调用以下方法,将960 / 640替换为布置屏幕时的宽高:
static private void AdaptiveUI()
{
int ManualWidth = 960;
int ManualHeight = 640;
UIRoot uiRoot = GameObject.FindObjectOfType<UIRoot>();
if (uiRoot != null)
{
if (System.Convert.ToSingle(Screen.height) / Screen.width > System.Convert.ToSingle(ManualHeight) / ManualWidth)
uiRoot.manualHeight = Mathf.RoundToInt(System.Convert.ToSingle(ManualWidth) / Screen.width * Screen.height);
else
uiRoot.manualHeight = ManualHeight;
}
}
2.4 UI布局处理
UI整体布局“居中”并非最佳处理方式,此时需要策划人员进行头脑风暴,也可参考其他游戏的自适应方法。若UI布局较为简单,如战斗UI,通常四个角有元素,可使用 Anchor 将其固定在屏幕上,或者使用新版本的NGUI提供的 UIWidget 设置固定位置。
3. 3D方面的自适应
在3D方面,以游戏中的人物为例。假设游戏的屏幕分辨率为960X640,在屏幕边缘放置一个3D角色,当屏幕分辨率变为1024×768时,该角色可能会超出屏幕。解决此问题需要实现3D摄像机的自适应。
可通过修改Camera的 Field of View 参数来解决。在合适的位置调用以下方法,这里借助了自适应NGUI屏幕的参数,使用 UIRoot 的 manualHeight,所以UI需要使用上述方法进行自适应。640表示制作时屏幕的高度,通过两者相除可得到Camera缩放的系数:
static public float getCameraFOV(float currentFOV)
{
UIRoot root = GameObject.FindObjectOfType<UIRoot>();
float scale = Convert.ToSingle(root.manualHeight / 640f);
return currentFOV * scale;
}
在合适的位置调用该方法,例如:
Camera.main.fieldOfView = getCameraFOV(60);
虽然修改摄像机的Z轴也能实现自适应效果,但建议使用 Field of View,因为游戏中摄像机的位置可能会发生变化,频繁修改Z轴属性较为麻烦,而 Field of View 只需设置一次。
4. 拉伸变形
可以让所有摄像机在初始化时调用以下方法,它会完全拉伸屏幕,但不建议使用,因为变形效果不佳:
foreach(Camera camera in Camera.allCameras)
{
camera.aspect = 640f/960f;
}
综上所述,通过以上方法可以在PC端实现NGUI的屏幕自适应,同时处理好UI和3D元素的显示问题。