UIRoot:
public class UIRoot : MonoBehaviour
{
static public List<UIRoot> list = new List<UIRoot>();
public enum Scaling
{
PixelPerfect, // 像素不变,大小变
FixedSize, // 大小不变,像素变
FixedSizeOnMobiles,
}
public Scaling scalingStyle = Scaling.PixelPerfect;
public int manualHeight = 720;
public int minimumHeight = 320;
public int maximumHeight = 1536;
public bool adjustByDPI = false;
public bool shrinkPortraitUI = false;
public int activeHeight
{
get
{
if (scalingStyle == Scaling.FixedSize) return manualHeight;
#if UNITY_IPHONE || UNITY_ANDROID || UNITY_WP8 || UNITY_BLACKBERRY
if (scalingStyle == Scaling.FixedSizeOnMobiles)
return manualHeight;
#endif
Vector2 screen = NGUITools.screenSize;
float aspect = screen.x / screen.y;
if (screen.y < minimumHeight)
{
screen.y = minimumHeight;
screen.x = screen.y * aspect;
}
else if (screen.y > maximumHeight)
{
screen.y = maximumHeight;
screen.x = screen.y * aspect;
}
// Portrait mode uses the maximum of width or height to shrink the UI
int height = Mathf.RoundToInt((shrinkPortraitUI && screen.y > screen.x) ? screen.y / aspect : screen.y);
// Adjust the final value by the DPI setting
return adjustByDPI ? NGUIMath.AdjustByDPI(height) : height;
}
}
static public void Broadcast (string funcName)
{
#if UNITY_EDITOR
if (Application.isPlaying)
#endif
{
for (int i = 0, imax = list.Count; i < imax; ++i)
{
UIRoot root = list[i];
if (root != null) root.BroadcastMessage(funcName, SendMessageOptions.DontRequireReceiver);
}
}
}
}
1.这个组件以静态的方式管理了所有的组件在一个list里面UIRoot,并且可以使用Broadcast方法进行消息广播。
2.这个组件是UI的根节点,它主要是通过缩放自己的方式来控制整个UI的大小,两种方式:PixelPerfect 和 FixedSize。
3.如果adjustByDPI = true,则高度为屏幕当前高度。反之,为manualHeight。
http://blog.youkuaiyun.com/asd237241291/article/details/8126619 这是一篇关于自适应屏幕大小的文章,我个人觉得没必要搞的这么复杂。一般使用FixedSize即可。
整个UIRoot最核心的功能就是整体缩放,所以必须把这块理解清楚。
activeHeight:1.类型为FixedSize时,它的值为manualHeight。2.adjustByDPI = true时,它为当前屏幕的高度。3.否则,activeHeight = 屏幕高度 的值会夹在一个范围内[minimum,maximum],如果超出这个范围,屏幕的宽度会等比缩放。
FixedSize:这种模式下,activeHeight的值跟屏幕本身的高度是无关的,你可以理解为固定大小。
pixelperfect:这种模式下有两种选择,一种是没有范围约束直接获取屏幕的高度,另一种是有范围约束。
可以肯定的是,无论是那种模式,U3D都不希望出现高宽非等比例缩放的情况,因为这样的话界面就会变形。
UIOrthoCamera:
public class UIOrthoCamera : MonoBehaviour
{
Camera mCam;
Transform mTrans;
void Start ()
{
mCam = camera;
mTrans = transform;
mCam.orthographic = true;
}
void Update ()
{
float y0 = mCam.rect.yMin * Screen.height;
float y1 = mCam.rect.yMax * Screen.height;
float size = (y1 - y0) * 0.5f * mTrans.lossyScale.y;
if (!Mathf.Approximately(mCam.orthographicSize, size)) mCam.orthographicSize = size;
}
}
很多文章都只是说用了这玩意就不能用UIRoot,可以简单的理解为它是PixelPerfect 适应方案,并且采用的是屏幕的高度,而不是人为设置的高度。
UICamera:
Event Type:四种类型,决定相机以什么样的方式碰撞检测,也可以理解为相机只检测什么样的控件。
public enum EventType : int
{
World_3D, // Perform a Physics.Raycast and sort by distance to the point that was hit.
UI_3D, // Perform a Physics.Raycast and sort by widget depth.
World_2D, // Perform a Physics2D.OverlapPoint
UI_2D, // Physics2D.OverlapPoint then sort by widget depth
}
Event Mask:决定触发什么类型的事件,可以是所有类型。
allow multi touch:勾选,就表示支持多点触控。
sticky tooltip:是否使用tooltip,在NGUI里面有个UITooltip专门用来处理tip这个需求的。
tooltip Delay:这个地方设置tip停留的时间
http://blog.youkuaiyun.com/tinyhum3d/article/details/9069639 这篇文章详细介绍NGUI里面制作tip相关的东西。
UICamera主要是负责事件的,其他的还有一些跟事件相关的选项