当前位置: 首页 > news >正文

【转】NGUI研究院之自适应屏幕(十)

http://www.xuanyusong.com/archives/2536

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

1.获取屏幕的宽高

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

这样的代码是错误的。

sprite.width = Screen.width ;

sprite.height =  Screen.height 

正确的方法应该是:

 我建议在项目中你可以封装两个只读的方法来获取NGUI 的宽和高。

2.自适应NGUI屏幕

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

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

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

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

NGUI研究院之自适应屏幕(十) - 雨松MOMO程序研究院 - 1

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

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

NGUI研究院之自适应屏幕(十) - 雨松MOMO程序研究院 - 2

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

NGUI研究院之自适应屏幕(十) - 雨松MOMO程序研究院 - 3

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

NGUI研究院之自适应屏幕(十) - 雨松MOMO程序研究院 - 4

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

NGUI研究院之自适应屏幕(十) - 雨松MOMO程序研究院 - 5

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

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

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

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

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

 

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

3.3D方面的自适应

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

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

NGUI研究院之自适应屏幕(十) - 雨松MOMO程序研究院 - 6

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

NGUI研究院之自适应屏幕(十) - 雨松MOMO程序研究院 - 7

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

 

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

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

4.拉伸变形

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

 

 

转载于:https://www.cnblogs.com/mimime/p/6240313.html

相关文章:

  • 团队代码中Bug太多怎么办?怎样稳步提高团队的代码质量
  • jquery控制按钮的禁用与启用
  • 输出100000以内的质数 (优化2)
  • 莫名其妙ng-change被触发两次
  • javascript2
  • jhipster 安装
  • 2015真正运维自动化技术沙龙活动
  • python 面向对象
  • Xcode中iPhone iPad模拟器调整大小的方法
  • 简单工厂模式
  • JVM
  • cpu主频信息
  • 详细解读Android中的搜索框(三)—— SearchView
  • 长城:场面很热闹情节很垃圾
  • API开发的版本控制技巧
  • 【刷算法】求1+2+3+...+n
  • Codepen 每日精选(2018-3-25)
  • MySQL-事务管理(基础)
  • orm2 中文文档 3.1 模型属性
  • React 快速上手 - 07 前端路由 react-router
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vue组件定义
  • 从零搭建Koa2 Server
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 前嗅ForeSpider采集配置界面介绍
  • 手写双向链表LinkedList的几个常用功能
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 昨天1024程序员节,我故意写了个死循环~
  • ​【已解决】npm install​卡主不动的情况
  • ​flutter 代码混淆
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.11) SiK Radio v2(一)
  • (function(){})()的分步解析
  • (多级缓存)多级缓存
  • (多级缓存)缓存同步
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ***检测工具之RKHunter AIDE
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET CORE Aws S3 使用
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • /var/log/cvslog 太大
  • @EnableConfigurationProperties注解使用
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [AIGC] Redis基础命令集详细介绍
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android Pro] AndroidX重构和映射
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [C++基础]-初识模板
  • [codeforces] 25E Test || hash