NGUI 屏幕自适应

雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表

 现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少这么多游戏都在用,它目前是能hold住的,嘿嘿。 这篇文章说说我现在是怎么自适应UI 和 3D 游戏的。。

1.获取屏幕的宽高

Screen.width  Screen.height 可以回去设备屏幕的宽高,但是它并不是NGUI的宽高。比如你想做一个全屏的UISprite 。

这样的代码是错误的。

sprite.width = Screen.width ;

sprite.height =  Screen.height 

正确的方法应该是:

1

2

3

4

5

6

7

8

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屏幕

在Hierarchy视图中选择UI Root (2D)然后在Inspector视图中、

Scaling Style :如果是手机游戏的就选择FixedSizeOnMobiles,它的意思就是开启UI整体缩放的支持。

Manual Height:这个属性就比较重要的,因为我们的自适应屏幕,原理就是根据Screen.width 和Screen.height来动态的计算它的实际高度,动态的修改这个值。

Min/Max inum Height:这就是支持的最大高度,和最小高度一般都是 640 到 1536。

开始做UI的时候就需要定制游戏主版本的屏幕分辨率,我定的分辨率是960X640,所以我屏幕的实际高度是640 。那么在Manual Height的参数我就需要写640.  

如下图所示,我在960X640的屏幕上布置了我的简单界面。

我举个典型的例子,这时候我把屏幕分辨率改成1024X768. 因为960X640 是3:2的屏幕,而1024X768是4:3的屏幕。所以屏幕就会变成那面这个样子。

然后,我们就需要来修改Manual Height这个参数,如果是1024X760的分辨率,那么此时它的Maunal Height应该是720。

在看看,如下图所示,界面整体布局居中显示了。但是布局的位置是没有发生任何改变的。

我个人觉得根本就是没有完美自适应的方法。除非你可以接收屏幕上的某些元素被拉伸变形。。 如上图所示,在这里我们只需要把背景的白框拉伸成屏幕的宽高即可。

说了半天就是一个简单的数学算法,根据布置UI时的分辨率,加上现在屏幕的分辨率根据这两个参数,动态的计算出现在manualHeight的高度。

我在Unity圣典上已经看到有人写了这个算法。

http://game.ceeger.com/forum/read.php?tid=9230&ds=1

找一个合适的地方调用一下如下方法。 960 /640换成你布置屏幕时的宽高即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

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;

}

}

 UI整体布局 “居中” 并不是一个好的处理办法,这时候就需要策划人员的头脑风暴了,不过可以参考一下别的游戏自适应的方法。如果你的UI布局比较简单的话,比如战斗UI。一般都是4个角有东西,可以用Anchor把它固定在屏幕上。或者用新版本的NGUI提供的UIWidget也可以设置固定的位置。

3.3D方面的自适应

我们在说说3D方面的自适应,比如游戏里面的人物。。我举个例子,比如我们游戏是960X640屏幕,在屏幕的边缘放一个3D的角色,那么此时屏幕变成1024×768那么这个小人可能就跑到屏幕外面了。。解决这个问题就需要3D 摄像机的自适应。

如下图所示,我在960X640屏幕的边缘放了一个3D的立方体对象。

然后我把屏幕设置成1024X768。如下图所示,可以看到这个立方体对象以后超出了屏幕。。。

有一个非常俏巧妙的方法可以解决它。就是修改Camera的Field of View的参数,找一个合适的地方调用一下这个方法。这里我借助了刚刚自适应NGUI屏幕的参数。这里我用到了UIRoot的manualHeight ,所以UI需要你是用上面介绍的方法来自适应,640表示我制作时屏幕的高度,拥着两个数相除那么就可以得到Camera缩放的系数了。

1

2

3

4

5

6

static public float getCameraFOV(float currentFOV)

{

UIRoot root = GameObject.FindObjectOfType<UIRoot>();

float scale =Convert.ToSingle(root.manualHeight / 640f);

return currentFOV * scale;

}

 找一个合适的地方调用,60表示默认的参数,getCameraFOV这个方法的原理就是根据默认的FOV参数加上当前屏幕的系数以及布置屏幕时的系数,动态计算出一个新的FieldOfView。

1

Camera.main.fieldOfView = getCameraFOV(60);

 说到这里其实修改射线机的Z轴也可以达到自适应的效果,但是我觉得最好用fieldofView,因为游戏中你的摄像机可能位置会发生变化,总不能一直去改Z轴的属性吧,而FiewldOfView你只需要设置一次就可以了。嘿嘿。

4.拉伸变形

你可以让所有的摄像机在初始化的时候调用一下这个方法,它会完完整整的拉伸屏幕 ,大家可以试试,不过千万不要用,因为变形了太难看。。。。

1

2

3

4

foreach(Camera camera in Camera.allCameras)

{

camera.aspect  = 640f/960f;

}

时间: 2024-11-13 06:51:24

NGUI 屏幕自适应的相关文章

NGUI屏幕自适应

NGUI确实是非常棒的一个做界面的插件,比起U3D自带的GUI要好很多,当然也有一些不好之处,毕竟什么都不可能那么完美. 最近在用Unity写游戏使用NGUI遇到了一个很多人都在遇到的问题,就是关于屏幕自适应,谷哥度娘里面写关于适应屏幕的帖子很多,但是大多都是一样抄来抄去,都是说是Panel里面加个UIStretch里面加个 if 分支,什么OnWidth什么的,还要把UIAnchor的side放置在Bottom等等步骤,过于麻烦,而且效果也一般. 不知道大家在用最新的Unity的时候在UISt

NGUI学习笔记(三):屏幕自适应

我们开发移动端游戏的时候,一般都会选择Constrained/FixedSize的缩放模式来保证图片在不同的分辨率下相对于屏幕的尺寸保持一致,但是对于屏幕自适应来说,这还是不够的,不同的手机存在不同的高宽比,所以需要引入相对位置的概念. NGUI作为一款成熟的UI插件,为我们提供了成熟的屏幕自适应技术. Anchor组件 我们可以创建一个Anchor组件到舞台,Anchor即锚点,其作用是可以指定为摄像机的9个点(分别是:上左.上.上右.左.中.右.下左.下和下右)为其锚点,当摄像机的尺寸变化(

【NGUI】屏幕自适应(不用UIStretch,用UIRoot)

原地址:http://blog.csdn.net/lzhq1982/article/details/18814023 这篇文章是转载的,之前用UIStretch做屏幕自适应,但一直有两个硬伤让我难受,一是屏幕被随意拉伸后,里面的UI就不是我想要的比例了,明明一个圆形变成椭圆了,一个高挑的美女变成一个肥姐了,好吧,这如果还能忍,那第二条真是让我尝尽了各种方法,那就是panel的裁剪用不了了,想做Scroll View做不了了,然后百度才知道要Panel做裁剪必须要求其scale和其父一直到根节点的

NGUI之自适应屏幕

 转载: 雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表 ,原文链接   现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少这么多游戏都在用,它目前是能hold住的,嘿嘿. 这篇文章说说我现在是怎么自适应UI 和 3D 游戏的.. 1.获取屏幕的宽高 Screen.width  Screen.height 可以回去设备屏幕的宽高,但是它并不是NGUI的宽高.比如你想做一个全屏的UISprite .

【Unity】关于屏幕自适应的思路

关于NGUI的屏幕自适应,大体思路可以这样做: 比如要实现在屏幕的左侧做一个长条背景: 可以看出这部分图片是和屏幕高度一致的.那么只要得到“制作时的屏幕高度”以及“当前运行屏幕高度”,求两个值的比值,然后当前UI的大小乘上这个比值即可得到UI适应后的大小.先完成这一步: 1.新建一个widget.因为此UI要一直靠在屏幕左边,所以它的pivot设置为左边.Size设置成当前(制作时)的屏幕大小,比如1280X800. 2.新建Sprite且为widget的子物体.摆好位置. 3.建立自适应脚本并

firemonkey 手机屏幕自适应程序问题

我是新手.在我才学了2个星期的时候,那个白痴老板说什么手机屏幕自适应程序,我当时不能理解呀,觉得用Delphi的布局设计不就行了吗.结果他说:我就是想让控件内容什么的放在小屏幕手机上也不出来.我就说,那用布局layout.结果那个傻x又是画控件关于屏幕的位置,又是记录控件的位置,整了一大套.整个把我给整晕了,新手伤不起啊,我不知道Delphi xe5有一个控件布局叫ScaledLayout,结果捣鼓了很长时间.我在Delphi交流群里说这个功能时,大家都说我想多了.唉 ,没办法自己又把控件布局什

css语法规则屏幕自适应及条目应用优先权

1. !important 提升指定样式条目的应用优先权. div { color: #f00 !important; color: #000;}在上述代码中,IE6及以下浏览器div的文本颜色为#000,!important并没有覆盖后面的规则:其它浏览器下div的文本颜色为#f00 2.可以让屏幕自适应的方法: /* 样式代码导入 样式文件 */ 第一种方式: <link media="screen and (width:800px)" rel="styleshee

关于android屏幕自适应的个人心得

这是一些博主自己对安卓的屏幕自适应的理解,有什么不到之处也别喷. 首先,观察新建的项目res文件夹,大家估计都能找到drawable文件夹有很多个,如drawable-hdpi.drawable-ldpi.drawable-mdpi.drawable-xhdpi,这些文件夹是谷歌公司为屏幕自适应做的准备,意思说各位朋友在做屏幕自适应之前应该准备5套资源图片来出来该问题.相应的比例关系大概是 1 : 0.5 : 0.75 : 1.5 : 2 ,而现在大部分4.0的机子不再适用于240*320和32

4种必须知道的Android屏幕自适应解决方案

文章来源:http://blog.csdn.net/shimiso/article/details/19166167 demo下载:http://www.eoeandroid.com/forum.php?mod=attachment&aid=NjE0Njh8ZTIyZDA2M2N8MTMzODgyOTQxN3w1NzAwOTV8MTczOTcz一.细说layout_weight    目前最为推荐的Android多屏幕自适应解决方案.    该属性的作用是决定控件在其父布局中的显示权重,一般用于