必备知识点

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. Android倒计时实现

    Android为我们封装好了一个抽象类CountDownTimer,可以实现计时器功能: /** * 倒数计时器 */ private CountDownTimer timer = new Count ...

  2. Redis-Sentinel 数据源配置

    1.redis配置文件 : redis.properties # Redis settings #sentinel_node_1 redis.sentinel1.host=192.168.0.1 re ...

  3. C#设计模式(2)——简单工厂模式(Factory )

    我们通过 Factory 创建对象不同的对象. 例如:如果创建一个汽车的接口,通过 工厂Factory 创建实现接口的对象,根据我们的选择来创建不同的对象. 创建汽车接口 /// <summar ...

  4. RedHat 7.0更新升级openSSH7.4p1

    由于目前服务器上ssh版本较低,存在安全漏洞,需要升级到最新版本. 系统版本:RedHat 7.0 旧openSSH版本:6.4p1 新openSSH版本:7.4p1 升级方式:源码安装 安装操作步骤 ...

  5. 机器学习中的算法(2)-支持向量机(SVM)基础

    版权声明:本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gma ...

  6. Microsoft DQS sqlException 0x80131904 - SetDataQualitySessionPhaseTwo

    遇到这个问题的原因可以从报错信息看出来,大概率是.net framework的问题 可以尝试如下解决途径 1. regenerate .net Assemble for DQS 2. 如果步骤一无法解 ...

  7. Java中锁的实现与内存语义

    目录 1. 概述 2. 锁的内存语义 3. 锁内存语义的实现 4. 总结 1. 概述 锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开 ...

  8. Python设计模式 - UML - 部署图(Deployment Diagram)

    简介 部署图也称配置图,用来显示系统中硬件和软件的物理架构.从中可以了解到软件和硬件组件之间的物理拓扑.连接关系以及处理节点的分布情况. 部署图建模步骤 - 找出需要进行部署的各类节点,如网络硬件设备 ...

  9. python note 03 切片及对字符串操作

    1.计算 1 - 2 + 3 ... + 99 中除了88以外的数之和 i = 1 sum = 0 while i < 100 : if i == 88 : i = i + 1 continue ...

  10. CentOS No package nginx available.

    CentOS No package nginx available. yum install epel-release 如果不行 https://blog.csdn.net/u012965373/ar ...