必备知识点

1.分辨率适配必然是Orthographic Camera

2.Camera下对应的“Size”(图1)属性大小的理解:当前摄像机高度 = Size * 2 * UnityUnit(Unity编辑器单位长)

3.NGUI象素比例与UnityUnit之间的比值关系为 1:1(这里需要注意所有父节点的缩放都要重置为1)

4.Game视图下分辨率(图2)的意义:

意义1:

  Game视图渲染时的光栅格个数(光栅格数越少,画面越模糊)

意义2:

  由于上面Size已经决定了摄像机高度,那么还需要根据这个“长宽比值”来决定摄像机的宽度

Eg:

  比如Size属性为384,分辨率设置为 2000 X 1000 那么最终 摄像机照射范围就是 “长 -----> 1536UntiyUnit, 宽 -----> 768UnityUnit”

                                          图1

                        图2(当分辨率比值不变,修改其数值大小时,照射范围一致,只是影响清晰度)


分辨率适配的原理:

1.我们最开始摆放UI的时候都需要有一个最初的分辨率和Camera Size(之后称之为 预设分辨率 & 预设Size)

2.我们假设预设分辨率比为3:2(1152 : 768),而目标分辨率比是未知的,存在以下2种情况 “长宽比小于 预设长宽比”,“长宽比大于 预设长宽比”

- 情况1

【】 由于屏幕高度没有发生变化,所以Camera Size不需要改变

【】 其他UI元素根据其anchor值决定是否 “移动” 或 ”缩放”

- 情况2

     【】 由于屏幕高度发生变化,所以要重新计算Camera Size 

     【】 其他UI元素根据其anchor值决定是否 “移动” 或 “缩放”

以下是分辨率控制器代码(Manager部分)

/***************************************
Editor: Tason
Version: v1.0
Last Edit Date: 2018-04-13
Tel: 328791554@qq.com
Function Doc:
分辨率适配
主要理解一下裁剪方式
***************************************/ using UnityEngine;
using System.Collections; public class ResolutionController : MonoBehaviour
{
//设置(时)分辨率
public int m_originalWidth = ;
public int m_originalHeigh = ; //设置(时)摄像机Size
public static float s_cameraSize;
[HideInInspector]
public float m_cameraSize; //管理的摄像机们
public Camera[] m_cameras; //偏移值
public static float s_scaleRatio = ;
public static float s_topCenter = ;
public static float s_bottomCenter = ;
public static float s_leftCenter = ;
public static float s_rightCenter = ; //横屏和竖屏判断 主要涉及裁剪方式
public static bool s_isHorizontalScreen = true; //原始长宽比
public static float s_originalHVRatio; // ----- Awake -----
private void Awake()
{
//初始化
m_cameraSize = m_originalHeigh / ;
s_cameraSize = m_cameraSize; //设置长宽比
s_originalHVRatio = (float)m_originalWidth / m_originalHeigh; //当前长宽比
float currentHVRatio = (float)Screen.width / Screen.height; float t1 = Screen.height * m_originalWidth;
float t2 = Screen.width * m_originalHeigh;
float temp;
/* 情况2
* ------------------
* | |
* |----------------|
* | |
* |----------------|
* | |
* ------------------
*/
if (currentHVRatio > s_originalHVRatio)
{
s_isHorizontalScreen = true; //得到纵向高的比值
s_scaleRatio = s_originalHVRatio / currentHVRatio;
//得到缩放后的Size大小
temp = m_cameraSize * s_scaleRatio; s_topCenter = temp - m_cameraSize;
s_bottomCenter = -s_topCenter;
s_leftCenter = ; s_rightCenter = ;
}
/* 情况1
* ------------------
* | | | |
* | | | |
* | | | |
* | | | |
* | | | |
* ------------------
*/
else
{
s_isHorizontalScreen = false;
//这个可划分为 “目标长 / 预设长 = 缩放比例”该比例<1
s_scaleRatio = currentHVRatio / s_originalHVRatio;
temp = m_cameraSize; s_topCenter = ; s_bottomCenter = ;
s_leftCenter = ( - s_scaleRatio) * m_cameraSize * s_originalHVRatio;
s_rightCenter = -s_leftCenter;
} //设置摄像机的size
foreach (var a in m_cameras)
{
if (a != null) a.orthographicSize = temp;
}
}
}

  代码中需要理解一下的地方就是 “第91行”“s_scaleRatio = currentHVRatio / s_originalHVRatio;”

“当前长 / 当前宽" 除以 “预设长 / 预设宽” 由于 情况1中 当前宽 = 预设宽 所以 上列算式可以划分为 "当前长" 除以 “预设长”

以下是分辨率受控体代码(受控体部分)

/***************************************
Editor: Tason
Version: v1.0
Last Edit Date: 2018-XX-XX
Tel: 328791554@qq.com
Function Doc:
分辨率子对象 配合 ResoulutionController 控制手机适配
***************************************/ using UnityEngine;
using System.Collections; public class ResolutionObject : MonoBehaviour
{
//情况1 (长宽比减小)是否缩放
public bool m_state1ScaleSwitch = true;
//情况2 (长宽比增加)是否缩放
public bool m_state2ScaleSwitch = true; //对齐锚点选择
public bool m_top;
public bool m_bottom;
public bool m_left;
public bool m_right; // ----- Start -----
private void Start()
{
Vector3 v;
if (!ResolutionController.s_isHorizontalScreen && m_state1ScaleSwitch)
transform.localScale *= ResolutionController.s_scaleRatio;
if (ResolutionController.s_isHorizontalScreen && m_state2ScaleSwitch)
transform.localScale *= ResolutionController.s_scaleRatio; if (m_top)
{
v = transform.position;
v.y = ResolutionController.s_cameraSize * ( - ResolutionController.s_scaleRatio) + transform.position.y * ResolutionController.s_scaleRatio + ResolutionController.s_topCenter;
transform.position = v;
} if (m_bottom)
{
v = transform.position;
v.y = ResolutionController.s_cameraSize * (ResolutionController.s_scaleRatio - ) + transform.position.y * ResolutionController.s_scaleRatio + ResolutionController.s_bottomCenter;
transform.position = v;
} if (m_left)
{
v = transform.position;
v.x = ResolutionController.s_cameraSize * ResolutionController.s_originalHVRatio * (ResolutionController.s_scaleRatio - ) + transform.position.x * ResolutionController.s_scaleRatio + ResolutionController.s_leftCenter;
transform.position = v;
} if (m_right)
{
v = transform.position;
v.x = ResolutionController.s_cameraSize * ResolutionController.s_originalHVRatio * ( - ResolutionController.s_scaleRatio) + transform.position.x * ResolutionController.s_scaleRatio + ResolutionController.s_rightCenter;
transform.position = v;
}
}
}

使用方法:

1.挂载Controller 设置对应预设值参数

2.挂载子对象控制器 设置其属性


不同缩放的距离说明(锚点不做说明)

1.情况1、2的缩放要求很多时候不一样 例如下图的妹子在勾选不同情况的缩放时···呈现的状态

如图上的妹子就应该 打开“横向缩放” 关闭"纵向缩放"

Update 1.1

1.以修改了Controller的适配BUG,原来有2个固定常量,现在修改成了变量(上面代码已经修改了但是忘记改版本号了)。

举个例子


使用方式

1.导入NGUI插件,创建背景图,删掉UIRoot对象下的UIRoot组件(即它自己的分辨率适配部分)。

2.将ResolutionController挂载在UIRoot对象下,修改UIRoot的Transform节点缩放为1, 并根据背景图片大小设置 CameraSize 及ResolutionController的分辨率参数。

3.将要修改的摄像机挂载添加到ResolutionController的控制数组中。

4.给需要缩放的物体挂载ResolutionObject 对象并调整参数,一般背景图是挂载对象,也不缩放的

下面我用新版本再举个例子

适配出来以后

----->

Ngui分辨率适配的更多相关文章

  1. Unity 利用NGUI做屏幕分辨率适配+学习UIDraggablePanel的使用

    原地址:http://blog.sina.com.cn/s/blog_697b1b8c0101g2r4.html 大家使用unity,一定有看中其跨平台的强大功能,因此也难免会遇到不同屏幕分辨率适配的 ...

  2. cocostudio做出来的界面如何进行分辨率适配,兼论cocos2dx3的多分辨率适配机制,以及retina适配机制

    cocos有很多代码实际上都不再使用了,看代码时反而误导了程序员. 比如一个简单的分辨率适配,我查到了setContentSize,然后调用setContentSize,毫无用处啊!于是乎,我到处查资 ...

  3. Android分辨率适配心得

    关于Android分辨率适配,这个是Android开发很头疼的一个问题,也需要花费相当一部分开发时间处理的一个问题,往往一个界面怎么适配就得想半天,特别是新手,也经常有人问我是怎么适配分辨率的,我也不 ...

  4. Viewport解决分辨率适配问题

    Viewport :   字面意思为视图窗口,在移动 web 开发中使用.表示将设备浏览器宽度虚拟成一个特定的值(或计算得出),这样利于移动 web 站点跨设备显示效果基本一致.   基本写法: &l ...

  5. xcode 开发ios兼容性问题的上下黑边 和 coco2d-x 游戏分辨率适配 ResolutionPolicy::FIXED_WIDTH 都会引起上下黑边问题!!!

    1:Xcode6在iPhone5+iOS7模拟器上编译,上下有黑边问题 问题描述: Xcode6环境下,对iPhone5或iPhone5s模拟器,在iOS7或iOS7.1下运行,屏幕上下有黑边.在iO ...

  6. 如何使用cocos2dx-jsbinding 来处理分辨率适配

    首先说点题外话,对于任何大型项目来说,coding的规范重要,在cocos2dx-jsbinding这个框架中,javascript是一个绝对核心的脚本语言,99%的游戏逻辑都由js完成.脚本的编写量 ...

  7. cocos2dx 分辨率适配问题

    分辨率适配问题好文章: http://www.cocoachina.com/bbs/read.php?tid=201987&page=1&toread=1#tpc http://www ...

  8. Android中,图片分辨率适配总结规则drawable drawable-mdpi drawable-hdpi drawable-nodpi drawable-ldpi

    一直关于android多分辨率适配有些疑惑,从网上找到一些资料并通过测试验证,参考链接:http://blog.csdn.net/lamp_zy/article/details/7686477 现记录 ...

  9. 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

随机推荐

  1. 浏览器局部打印实现,iframe打印

    const handleOk = () =>{ let ele = document.getElementById('printInfor'); let iframe=window.frames ...

  2. Linux命令:read

    在shell中,内建(builtin)命令read,格式如下: read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] ...

  3. 详解BOM用途分类及在汽车企业中的应用

    摘要:在整车企业中,信息系统的BOM是联系CAD.CAPP.PDM和ERP的纽带,按照用途划分产品要经过产品设计,工程设计.工艺制造设计.生产制造4个阶段,相应的在这4个过程中分别产生了名称十分相似但 ...

  4. Android Studio 3.1.3正式版的新坑。。。

    Gradle编译时没问题,运行App时候出现: java.util.NoSuchElementException java.lang.RuntimeException: com.android.bui ...

  5. SQL Server与MySQL在“存在则更新,不存在则插入”并发处理上的一些差异。

    “存在则更新,不存在则插入的逻辑”并发情况下的处理 在sqlserver中: 在sqlserver中,是通过可序列化隔离级别+排它锁的方式来锁定一个范围来实现的当前锁定一个不存在的记录的时候,sqls ...

  6. Unity3D AssetBundle相关

    Unity3D AssetBundle相关 首先,先看一下原理吧  Unity3D研究院之Assetbundle的原理(六十一) 其次,接着往下看:Unity3D研究院之Assetbundle的实战( ...

  7. pycharm 下使用tensorflow 之环境配置

    我们常常看代码使用ide里面看,而且还可以看到调试信息(虽然tensorflow有专门的调试介绍哈) 但是,常常代码在终端里面执行可以直接执行,但是到pycharm里面就会出现各种问题,常见的就是找不 ...

  8. zend studio mac

    zend studio mac是一款PHP语言集成开发环境(IDE),专为开发人员研发,它包含了所有组件的开发为完整的PHP应用程序生命周期提供条件.zend studio是很多开发人员.程序员等专业 ...

  9. Python代码的人机大战(循环嵌套)

    第一次动手写随笔,记录一下今早的1.5小时努力成果 题目是这样的 : 人和机器进行猜拳游戏写成一个类,首先选择角色:1 曹操 2张飞 3 刘备,然后选择的角色进行猜拳:1剪刀 2石头 3布 玩家输入一 ...

  10. linux 下将tomcat注册成服务并开机启动

    一.将startup.sh和shutdown.sh新建软连接到/usr/bin ln -s /usr/local/apache-tomcat-8.5.38/bin/startup.sh /usr/bi ...