原地址:http://blog.csdn.net/lzhq1982/article/details/18814023

这篇文章是转载的,之前用UIStretch做屏幕自适应,但一直有两个硬伤让我难受,一是屏幕被随意拉伸后,里面的UI就不是我想要的比例了,明明一个圆形变成椭圆了,一个高挑的美女变成一个肥姐了,好吧,这如果还能忍,那第二条真是让我尝尽了各种方法,那就是panel的裁剪用不了了,想做Scroll View做不了了,然后百度才知道要Panel做裁剪必须要求其scale和其父一直到根节点的scale都是(1,1,1),这还咋拉伸啊,然后看到很多朋友的各种代码尝试,结果一一失败了,反正是不好使,所以用UIStretch做屏幕自适应真是蛋疼啊,下了个新的NGUI版本3.0.8,UIStretch已经不能用了,看来连官方都不太支持了,好在还有其他办法,看了一位朋友的博客,写的非常清楚了,我这里做一下转发,真是帮我解决了所有问题:

看过一些文章,大多数都用UIStretch。说实话我并不喜欢用这个脚本。

我一直对那些在屏幕适应上出现问题的人推荐使用UIRoot的ManualHeight。

先提供三个截图。看看效果是否是你想要的。旁边空白出来的地方,你需要和策划、美术商量用一些背景挡住。

1、正常开发分辨率下:

2、看起来较细的分辨率:

3、看起来较宽的分辨率:

使用注意:

1、和策划制定好开发时分辨率。这很重要,要保证所有UI都在同样的分辨率下制作。

2、把我这个脚本挂在UIRoot上。UIRoot的Scaling Style修改为FixedSize。

3、aspectRatioHeight、aspectRatioWidth分别为开发时的高和宽。

4、每个UIRoot都需要调整ManualHeight到和策划制定的高度。

5、Unity3D的Game窗口,调整到相应的分辨率。

(感谢成都-大强提供以下版本。注意:UICamera.onScreenResize是3.0+版本的,如果报错请删除即可

  1. using UnityEngine;
  2. [ExecuteInEditMode]
  3. [RequireComponent(typeof(UIRoot))]
  4. public class SZUIRootScale : MonoBehaviour
  5. {
  6. public int aspectRatioHeight;
  7. public int aspectRatioWidth;
  8. public bool runOnlyOnce = false;
  9. private UIRoot mRoot;
  10. private bool mStarted = false;
  11. void Awake()
  12. {
  13. UICamera.onScreenResize += ScreenSizeChanged;
  14. }
  15. void OnDestroy()
  16. {
  17. UICamera.onScreenResize -= ScreenSizeChanged;
  18. }
  19. void Start()
  20. {
  21. mRoot = NGUITools.FindInParents<UIRoot>(this.gameObject);
  22. mRoot.scalingStyle = UIRoot.Scaling.FixedSize;
  23. this.Update();
  24. mStarted = true;
  25. }
  26. void ScreenSizeChanged()
  27. {
  28. if (mStarted && runOnlyOnce) {
  29. this.Update();
  30. }
  31. }
  32. void Update()
  33. {
  34. float defaultAspectRatio = aspectRatioWidth * 1f / aspectRatioHeight;
  35. float currentAspectRatio = Screen.width * 1f / Screen.height;
  36. if (defaultAspectRatio > currentAspectRatio) {
  37. int horizontalManualHeight = Mathf.FloorToInt(aspectRatioWidth / currentAspectRatio);
  38. mRoot.manualHeight = horizontalManualHeight;
  39. } else {
  40. mRoot.manualHeight = aspectRatioHeight;
  41. }
  42. if (runOnlyOnce && Application.isPlaying) {
  43. this.enabled = false;
  44. }
  45. }
  46. }

【NGUI】屏幕自适应(不用UIStretch,用UIRoot)---------------good的更多相关文章

  1. 【Unity3D插件】NGUI屏幕自适应(转)

    屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 1 ...

  2. NGUI屏幕自适应

    NGUI确实是非常棒的一个做界面的插件,比起U3D自带的GUI要好很多,当然也有一些不好之处,毕竟什么都不可能那么完美. 最近在用Unity写游戏使用NGUI遇到了一个很多人都在遇到的问题,就是关于屏 ...

  3. NGUI 屏幕自适应

    雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表  现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但是至少 ...

  4. NGUI屏幕自适应(转)

      屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 ...

  5. NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)

    具体细节可以参考另外一篇随笔! 以下提供的算法完成的事: 1.自适应1280x720分辨率以下的屏幕 2.自适应1280x720分辨率以上的屏幕 在我设定的要求内包括的分辨率大部分都测过了,背景图.全 ...

  6. NGUI屏幕自适应解决方案

    NGUI研究院之自适应屏幕 http://www.xuanyusong.com/archives/2536 Unity3D研究院之使用Android的硬件缩放技术优化执行效率 http://www.x ...

  7. NGUI 屏幕自适应(初始设定宽高800x480只支持比其大的屏幕)

    自适应讲解部分可以参考以下网址:http://www.xuanyusong.com/archives/2536,下面代码中提到的AdaptiveManualHeight()函数就是参考该文章的. 下面 ...

  8. [Unity3D]NGUI用Sprite动画和屏幕自适应做游戏开始场景

    我们在玩任何一款手游产品时,都是先上来个logo界面,游戏欢迎界面等,这就意味着我们要做一款游戏需要多个场景,场景之间来回切换实现游戏逻辑,unity也不例外,所以从本篇开始将会介绍如何搭建多个场景, ...

  9. NGUI之自适应屏幕

     转载: 雨松MOMO 2014年05月04日 于 雨松MOMO程序研究院 发表 ,原文链接   现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他 ...

随机推荐

  1. 一个关于如何创建类似于QQ客户端聊天窗口的模拟小项目

    对于不久之前学习到的一个有关的类似于QQ聊天框的模拟项目,对其中涉及到的知识在这里做一下总结. 首先,你要先创建一个客户端聊天框(取名为:ChatClient,它是你创建的类),这个类继承了Frame ...

  2. python学习day1--python基础

    Python的优缺点 先看优点 Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂 ...

  3. MyEclipse SVN 插件

    一.下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 在打开的网 ...

  4. spring读取prperties配置文件(1)

    博客地址http://www.cnblogs.com/shizhongtao/p/3438431.html 属性文件命名是*.properties,在java中,用类java.util.Propert ...

  5. c#基础笔记-----------集合

    首先所谓集合是用于管理对象的容器类.一方面集合将独立的对象汇集成群集,作为一个群集来管理,以便进行整体性操作:而另一方面,集合可以方便地获取群集中的个体,进行个体化操作.在.Net中,集合被封装为对象 ...

  6. VS2013编译GLUI

    vs自带的OpenGL为1.1版本,太老了. 1,编译glut https://www.opengl.org/resources/libraries/glut/glut37.zip 查看生成路径,可以 ...

  7. Jquery操作下拉框(DropDownList)的取值赋值实现代码(王欢)

    Jquery操作下拉框(DropDownList)的取值赋值实现代码(王欢) 1. 获取选中项: 获取选中项的Value值: $('select#sel option:selected').val() ...

  8. KnockoutJS(3)-绑定语法

    绑定语法大致分为2种: 1. 数据绑定(data-bind syntax) 2. 绑定上下文(Binding Context) 下面针对这2中绑定语法分别介绍一下 1. 绑定上下文(Binding C ...

  9. checkBox控件的CheckedChanged与CheckedStateChanged区别

    Checked属性为bool类型,CheckState属性为枚举类型(CheckState.Checked.CheckState.Unchecked和CheckState.Indeterminate) ...

  10. jQuery ui 中文日历

    jQuery ui 中文日历 <link href="css/jquery-ui-1.10.4.custom.min.css" rel="stylesheet&qu ...