您的位置:首页 > 产品设计 > UI/UE

NGUI自适应

2014-05-05 22:22 267 查看


原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 本文链接地址:Unity3D
NGUI自适应屏幕分辨率

1.UIRoot:根据高度自适应屏幕分辨率。

NGUI根目录的UIRoot组件自带了根据高度自适应分辨率的功能。
Scaling Style属性可选择三种不同的缩放策略。

PixelPerfect 完美像素:直接显示设定好的像素。当屏幕高度低于minimum Height时按比例缩小,当屏幕高度大于maximum Height时按比例扩大。
FixedSize 按比例缩放:在设定好的基础上,直接按比例缩放。
FixedSizeOnMobiles 合体版,android和ios为FixedSize方式,其它按照PixelPerfect方式。

// FixedSize时:填理想分辨率的高度

// FixedSizeofWidth时:填理想分辨率的宽度

Manual Height:先按照理想分辨率做。当Game视图(打包后的屏幕分辨率)不是这个理想分辨率的时候就会进行比例缩放。

Minimum Height:Game视图低于这个数值开始按比例缩放。

Maximum Height:Game视图高于这个数值开始按比例缩放。

这三种缩放方式全部都是按照高度计算缩放比例,完全忽略宽度。

在制作时UI比例按照最长的16:9(红色)来做,另外3:2(绿色)为内容区域。红色两边的位置在不同比例的手机上会有不同程度的别切割的情况,所以不要把游戏内容放在这一区域。



2.UIRoot:根据宽度自适应屏幕分辨率。

UIRoot已经实现了根据高度自适应的功能,但是我现的需求是要根据宽度来自适应,屏幕高度高于UI高度则留空白。

1.首先给UIRoot增加一种状态

public enum Scaling

{

PixelPerfect,

FixedSize,

FixedSizeOnMobiles,

/// <summary>

/// 根据宽度适配

/// </summary>

FixedSizeofWidth,

}

2.实现还是需要FixedSize的算法,所以需要修改两个判断语句


修改1:

public float GetPixelSizeAdjustment (int height)

{

height = Mathf.Max(2, height);

//修改1

if (scalingStyle == Scaling.FixedSize || scalingStyle == Scaling.FixedSizeofWidth)

return (float)manualHeight / height;

#if UNITY_IPHONE || UNITY_ANDROID

if (scalingStyle == Scaling.FixedSizeOnMobiles)

return (float)manualHeight / height;

#endif

if (height < minimumHeight) return (float)minimumHeight / height;

if (height > maximumHeight) return (float)maximumHeight / height;

return 1f;

}

修改2:

public int activeHeight

:{

get

{

int height = Mathf.Max(2, Screen.height);

//修改2

if (scalingStyle == Scaling.FixedSize || scalingStyle == Scaling.FixedSizeofWidth)

return manualHeight;

#if UNITY_IPHONE || UNITY_ANDROID

if (scalingStyle == Scaling.FixedSizeOnMobiles)

return manualHeight;

#endif

if (height < minimumHeight) return minimumHeight;

if (height > maximumHeight) return maximumHeight;

return height;

}

}

3.增加按宽度自适应算法

void Update ()

{

#if UNITY_EDITOR

if (!Application.isPlaying && gameObject.layer != 0)

UnityEditor.EditorPrefs.SetInt("NGUI Layer", gameObject.layer);

#endif

if (mTrans != null)

{

float calcActiveHeight = activeHeight;

if (calcActiveHeight > 0f )

{

float size = 2f / calcActiveHeight;

//看这里,看这里,看这里

if (scalingStyle == Scaling.FixedSizeofWidth)

{

float radio = (float)Screen.width / Screen.height;

size = size * radio;

}

Vector3 ls = mTrans.localScale;

if (!(Mathf.Abs(ls.x - size) <= float.Epsilon) ||

!(Mathf.Abs(ls.y - size) <= float.Epsilon) ||

!(Mathf.Abs(ls.z - size) <= float.Epsilon))

{

mTrans.localScale = new Vector3(size, size, size);

}

}

}

}

3.UIStretch:根据宽度自适应屏幕分辨率。(NGUI3.0.7版本后不再支持)

这个是早期NGUI实现自适应分别率的一种方法,新版本中加入UIRoot自适应的方法后,这个脚本就不在被官方推荐使用了。

这个脚本自带的Style除了按高度自适应的功能之外,按宽度自适应是要拉伸图像的,并不能满足我们的要求。
最符合我们的要求的就是BasedOnHeight,那我们就按照这个功能修改一个BasedOnWidth出来,之前的博客中写过这个功能,现在这篇文章直接替换了之前的,所以我还是贴出修改的内容吧。
首先在Style枚举中增加一个BasedOnWidth,类型

public enum Style

{

None,

Horizontal,

Vertical,

Both,

BasedOnHeight,

BasedOnWidth,

FillKeepingRatio,

FitInternalKeepingRatio

}

Update方法中增加一个if分支。

if (style == Style.BasedOnHeight)

{

localScale.x = relativeSize.x * rectHeight;

localScale.y = relativeSize.y * rectHeight;

}else if (style == Style.BasedOnWidth)

{

localScale.x = relativeSize.x * rectWidth;

localScale.y = relativeSize.y * rectWidth;

}

else if (style == Style.FillKeepingRatio)

{……}

这个脚本是通过拉伸scale实现,所以这个脚本要放在你需要拉伸的UI上(如果你只需要一个背景图片自适应屏幕分辨率,那就把这个脚本添加到这个背景图片中,如果要一个panel内所有元素都自适应,那就放在这个panel上。如果想让所有的UI全部自适应分辨率,那就放在NGUI的cameta上。)
ui Camera属性需要选择渲染当前UI的摄像机。

使用步骤:
1.把Game视图设定一个最理想的宽度(以后按照这个比例缩放。)。
2.按需求选择一个放置UIStretch的物体,然后添加这个组件。并将ui cameta赋值。
3.将ui cameta的Size修改为当前屏幕的宽度。(这个物体的Scale的X、Y已经被UIStrech设置为屏幕宽度,此值不能被修改。)
4.这个时候改变窗口宽度,只有该物体Scale 的X、Y已被自动修改,UI视图已自动适应~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: