Unity NGUI的多分辨率适配
参考链接:http://blog.csdn.net/mfc11/article/details/17681429,作者:CSDN mfc11
1、NGUI默认的适配方式:
NGUI默认是适配方式是根据高度适配,高度适配的具体设置可以参看连接:http://www.cnblogs.com/vitah/p/3942392.html。
2、使用默认适配方式可能出现的问题:
当目标设备的宽高比与所编辑页面的宽高比一致时,整个UI将完美显示;当目标设备宽高比小于所编辑的宽高比时,页面宽度将大于设备宽度,使得多出的部分无法显示;而当目标设备宽高比大于所编辑宽高比时,页面宽度小于设备宽度,设备两边将出现黑边。
3、使用UIAnchor:
UIAnchor则是将整个页面分为TopLeft/Top/TopRight/Left/Center/Right/BottomLeft/Bottom/BottomRight九个区域,挂载了UIAnchor组件的节点都将按照设置自动停靠到相应的区域中。有了UIAnchor,上面的两个问题将被一定程度的解决:当目标设备宽高比小于编辑的宽高比时,由于UIAnchor的自动停靠功能,UI不会被裁切掉,但UI之间的左右间距将相应变小,有可能出现UI重叠的问题;当目标设备宽高比大于所编辑宽高比时,UI之间的左右间距将变大,好在这样起码不会有UI被裁切或重叠。
这种使用UIAnchor的方法,只需要解决可能出现的UI重叠的情况,不过当有出现全屏的sprite时,一张铺满整个屏幕的UISprite不管是否使用UIAnchor,在目标设备宽高比更小时,sprite都会在横向上被裁切,而将目标设备宽高比更大时,sprite都不能铺满整个屏幕。
4、在使用UIAnchor时需要调节UI显示的问题:
总结下就三个问题:
(1)设备宽高比比所给UI的宽高比更小时,UI的重叠问题;
(2)设备宽高比比所给UI宽高比小,全屏sprite被裁切;
(3)设备宽高比比所给UI宽高比大,全屏sprite不能铺满整个屏幕;
5、设备宽高比比所给UI的宽高比更小时,UI的重叠问题的解决方式:
当设备宽高比比所给UI宽高比更小,UI Root会根据UI的高度调节scale大小,使得设备宽度不足以显示全部全部的UI内容,我们可以调节摄像机的Camera.orthographicSize(仅适用2D GUI),以足够显示页面的宽度。即,改变了NGUI原有的“高度适配”原则,转为“宽度适配”,使得整个页面都得以显示,而由于UIAnchor的存在,UI的左右间距保持不变,但上下间距会变大。给出代码,挂载在UI Root下的Camere对象上:
using UnityEngine;
using System.Collections; public class UIAdjust : MonoBehaviour
{
// 所给UI的宽高
private float standard_width = 1280f;
private float standard_height = 720f; // 设备的宽高
private float device_width = 0f;
private float device_height = 0f; public void Awake()
{
// 获取设备的宽高
device_width = Screen.width;
device_height = Screen.height; SetCameraSize();
} private void SetCameraSize()
{
float adjustor = 0f; // UI的宽高比
float standard_aspect = standard_width / standard_height; // 设备的宽高比
float device_aspect = device_width / device_height; // 设备宽高比小于UI的宽高比,调节Camere的orthographicSize,使设备的宽度能显示全部UI,即在高度适配的基础上再按宽度适配
if (device_aspect < standard_aspect)
{
adjustor = standard_aspect / device_aspect;
camera.orthographicSize = adjustor;
}
}
}
上诉代码可以解决非全屏的UI适配问题;
6、在5步骤的基础上,全屏sprite的显示问题:
在5步骤的基础上,全屏sprite的显示会出现两个问题:
(1)设备宽高比更小时,sprite上下不填满:
(2)设备宽高比更大时,sprite左右不填满;
这时候我们根据对应的比例调节全屏sprite在上下方向和左右方向的scale值即可,前提是该sprite可以拉伸,如果是不能拉伸的sprite需要采用其他的方法,给出全屏sprite的适配代码,挂载在需要全屏显示的sprite下:
using UnityEngine;
using System.Collections; public class FullScreenSpriteAdjust : MonoBehaviour
{
private float standard_width = 1280f;
private float standard_height = 720f;
private float device_width = 0f;
private float device_height = 0f; void Awake()
{
device_width = Screen.width;
device_height = Screen.height;
SpriteAdjust();
} void SpriteAdjust()
{
// 图片标准的宽高比
float standard_aspect = standard_width / standard_height; // 设备的宽高比
float device_aspect = device_width / device_height; float scale_x = ;
float scale_y = ; // 设备宽高比大于图片宽高比,sprite左右不填满
if (device_aspect > standard_aspect)
{
scale_x = device_aspect / standard_aspect;
}
// 设备宽高比小于图片宽高比,sprite上下不填满
else if (device_aspect < standard_aspect)
{
scale_y = standard_aspect / device_aspect;
} gameObject.transform.localScale = new Vector3(scale_x, scale_y, gameObject.transform.localScale.z);
}
}
文章中内容几乎是复制参考链接的,感谢作者给出的想法。代码是自己写的,如果有更好的方法可以留言或者邮箱:linw1225#163.com(#换成@)~·
Unity NGUI的多分辨率适配的更多相关文章
- 【转】Unity3d + NGUI 的多分辨率适配
原文地址:http://www.cnblogs.com/cqgreen/p/3348154.html 一.当下移动设备的主流分辨率(数据来自“腾讯分析移动设备屏幕分辨率分析报告”) 1.1 iOS ...
- Unity3d + NGUI 的多分辨率适配
一.当下移动设备的主流分辨率(数据来自“腾讯分析移动设备屏幕分辨率分析报告”) 1.1 iOS设备的分辨率主要有: 宽 高 宽高比 960 640 1.5 1136 640 1.775 1024 ...
- Unity3d + NGUI 的多分辨率适配(黑边)
原地址:http://www.2cto.com/kf/201310/250921.html 一.当下移动设备的主流分辨率(数据来自“腾讯分析移动设备屏幕分辨率分析报告”) 1.1 iOS设备的分辨率主 ...
- 【Unity3D游戏开发】NGUI之多分辨率下完美分布式协同开发 (五)
NGUI多分辨率下完美分布式协同开发:不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 NGUI多分辨率下完美分布式协同开发不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 开发问题 原因分析 ...
- Cocos与Cocos2d-x协作教程——多分辨率适配
http://www.cocoachina.com/bbs/read.php?tid-288123.html Cocos v2.1开始新增了一种新的多分辨率适配方案:流式布局. 这种布局相比Cocos ...
- Android多分辨率适配
前一阶段开发android项目,由于客户要求进行多分辨率适配,能够支持国内主流的分辨率手机.因此经过了几次开发走了很多弯路,目前刚刚领略了android多分辨率适配的一些方法. 先介绍一下所走的弯路, ...
- Android多分辨率适配经验总结
Android多分辨率适配是一件很有意义但是比较麻烦的事情,网上有很多关于多分辨率适配的文章,多数文章讲解的都是整个APP的图片比较规则,可以将图片做成9图来完成多分辨率适配,但是对于一些游戏类应 ...
- 【转】android多分辨率适配
前一阶段开发android项目,由于客户要求进行多分辨率适配,能够支持国内主流的分辨率手机.因此经过了几次开发走了很多弯路,目前刚刚领略了android多分辨率适配的一些方法. 先介绍一下所走的弯路, ...
- unity NGUI点击消息不传入到场景中去
unity NGUI点击消息不传入到场景中去 1.今天遇到的问题是点击NGUI的按钮,场景中也相应了这个消息 解决的办法是在场景中需要互动的时候,也就是在update中进行判断 是否是点击了NGUI按 ...
随机推荐
- Java 406
项目改名之后, 项目上传后,报错,406,可是项目本地是可以跑起来的, 联系管理员,管理员改了个/etc/httpd/conf/workers2.properties 里面,将本次的项目加入进去就OK ...
- PHP 的try catch 报错捕获机制
首先上代码: try { echo 'Never executed'; echo "<br>"; if(1<0){ echo 'end'; }else{ thro ...
- 导出你的GAC Assembly中的DLLS
方法1: CMD命令中,进入C:\windows\assembly,然后XCOPY GAC_MSIL c:\temp /E 这样就得到了dlls了,以命名空间来分类. 如果想将dlls从集合中分出来, ...
- Java方法-字符串
[Java字符串] 通过字符串函数 compareTo (string) ,compareToIgnoreCase(String) 及 compareTo(object string) 来比较两个字符 ...
- C# Activator.CreateInstance()
C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.CreateInstance (Type, Objec ...
- c#读取文件
你平时是怎么读取文件的?使用流读取.是的没错,C#给我们提供了非常强大的类库(又一次吹捧了.NET一番), 里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件的一般手段,那么你真的会用它 ...
- ITEXTSHARP学习整理
学习的版本iTextSharp.5.5.5. 关于获取PDF中的图片资源 /// <summary> /// 将PDF中的图片资源转换成二进制 /// </summary> / ...
- delegate-使用笔记
public class testclass { public class ProductImages : Page { protected Repeater rptSmallUrls; protec ...
- java.lang.reflection打印一个类的全部信息
package com.ljy.chapter5; import java.lang.reflect.Constructor; import java.lang.reflect.Field; impo ...
- js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数
文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法 先创建一个对象函数 function Obj() { this.addre ...