UGUI开始学习搭建界面自适应屏幕实现详解

2015年03月19日 11:59 0 点赞 0 评论 更新于 2025-11-21 17:43

UGUI目前已经到beat21版本了,直觉告诉我正式版马上就要发布。刚好今天有空,我便抽空学习一下UGUI。此前我一直使用NGUI,真心希望UGUI的诞生能彻底取代NGUI(虽然目前不太现实)。今天我主要研究的是界面搭建以及屏幕自适应相关内容,在此记录下我的学习笔记,欢迎大家一起讨论。

Canvas的Render Mode

如下图所示,我们先来了解Canvas的Render Mode,它一共有三种模式:

1. Screen Space – Overlay

此模式不需要UI摄像机,UI将始终显示在所有摄像机画面的最前面。不过,我认为这种模式存在局限性。例如,如果我们想在UI前面放置一些元素,如特效或其他UI,就无法实现。

2. Screen Space - Camera

这是我打算采用的模式。在这种模式下,需要提供一个UICamera。它的原理与NGUI很相似,如果我们想在UI前面添加特效,只需创建一个深度大于这个UICamera的摄像机即可。

3. World Space

这种模式下的UI是完全3D的,UGUI的很多示例都采用了这种模式。但就目前而言,我暂时用不到。

Canvas Scaler

如下图所示,接下来看看Canvas Scaler。在处理屏幕自适应方面,UGUI无需我们自己编写算法。

  • UI Scale Mode: Scale With Screen Size:表示以宽度为标准进行缩放。由于我搭建界面时的尺寸是960X640,所以这里我设置为960X640。
  • Screen Match Mode:选择Expand,这是UGUI实现屏幕自适应的选项。

层次视图分析

如下图所示,下面来分析一下我的层次视图:

  • Main Camera:即主摄像机,也是透视摄像机,它的深度最小,会最先绘制。
  • Canvas:相当于画布,下面挂载了UICamera和UIForward摄像机。
  • UICamera:下面挂载着所有uGUI的UI控件,它的深度大于MainCamera。
  • UIForward:用于显示需要在UICamera前面显示的元素。注意,Camera的size = 3.2,这是通过960 / 640计算得出的。

挂载UI控件

接下来,在UICamera下面挂载UI控件。这个操作比较简单,就不详细说明了。

3DCamera的自适应

由于UGUI已经帮我们实现了UI的自适应,所以我们只需处理3DCamera的自适应。将下面的脚本挂载在Main Camera上即可:

using System.Collections;
using UnityEngine.UI;

public class CameraScale : MonoBehaviour {
void Start () {
int ManualWidth = 960;
int ManualHeight = 640;
int manualHeight;
if ((float)Screen.height / Screen.width > (float)ManualHeight / ManualWidth)
manualHeight = Mathf.RoundToInt((float)ManualWidth / Screen.width * Screen.height);
else
manualHeight = ManualHeight;
Camera camera = GetComponent<Camera>();
float scale = (float)manualHeight / 640f;
camera.fieldOfView *= scale;
}
}

特效层设置

记得增加一个UIForward层,这样如果想在UI前面添加特效,只需将特效的Layer设置为UIForward即可。

作者信息

menghao

menghao

共发布了 3994 篇文章