Unity屏幕适配解决方案

2023-11-13

UI尺寸选择

市面设备比例

截至2017年9月,iOS与Android移动游戏设备比例约为iOS占28%,Android占72%,分辨率比例如下(推荐参考来源:WeTest平台、腾讯移动分析)

通过以上数据可以计算,Android平台1080P以上为50%左右,iOS平台为35%,1080P及以上的设备占所有移动游戏设备的综合比例为72%*50%+28%*35%=46%。但是考虑到Android平台存在较多大屏幕但GPU性能较差的设备,体验流畅优先时会将这部分机型降分辨率处理。通过结合Android TOP100机型的数据,在TOP100的60台1080P手机中, 高端机为20台,占比34%,中端机为35台,占比58%,低端机为5台,占比8%,中端机中大约有50%的设备为保持流畅需要降分辨率运行。所以实际上Android平台有效的1080P设备占比50%*(58%*50%+34%)=31%,即综合来看有效的1080P设备仅占72%*31%+28%*35%=32%。

内存占用

理论上,1080P图片内存占用是720P的(1080/720)2=2.25倍。在游戏开发过程中实际上还要更高,因为为优化性能考虑,游戏内大部分UI都会被打成一张张图集(一般为1024x1024),而由于UI图片尺寸大多是不规则的,这会造成越大规格的图片排列后产生的空白缝隙越大(未被利用的图集空间),所以1080P下会比720P有额外更多的内存消耗。

结论:尽管1080P的画面表现力和细腻程度比720P更好,但是由于有效的1080P设备占比并不高,并且1080P对内存占用和包体大小的影响程度也很大,综合考虑,我们将游戏的设计分辨率定为720x1280。

分辨率适配

目前移动设别主流分辨率有720P、1080P、2K等,所以需要适配市面上不同分辨率的机型,确保不同分辨率下都有合适的画面表现。Unity中导入图片的Pixels Per Unit为默认值100,开发时我们将游戏场景中的所有正交摄像机的Size(即半高)设置为720/100/2=3.6Unit,所有的画布缩放参照分辨率设置为1280x720,在UI不缩放时(native size),正交摄像机显示的画面可以完全还原UI的设计效果,便于开发阶段的UI制作。

高分辨率

由于我们的设计分辨率为720x1280,所以游戏默认渲染分辨率为720P。同时为了充分利用高端设备的硬件,对于1080P及以上的设备我们也提供高分辨率选项,开启时游戏会使用1080P渲染,这不会对UI产生任何影响(因为我们只使用一套720P的UI资源),但是3D场景和特效的显示效果会更加细腻,当然这也会带来更大的性能开销。

分屏模式

Android 7.0中引入了多窗口显示模式(Multi-Window),在手持移动设备上即分屏模式(Spilt-Screen),我们游戏为了支持分屏模式,需要在安卓的清单文件(AndroidManifest.xml)中针对UnityPlayer所在的Activity添加android:resizeableActivity="true",开发时可以使用Android原生方法Activity.isInMultiWindowMode判断当前是否处于分屏模式。在用户开启分屏模式时,我们不能简单使用Screen类来获取屏幕的宽高,而是使用原生方法

Activity.getWindowManager().getDefaultDisplay().getMetrics(metrics)

传入的参数是Android.util 包下的DisplayMetrics 类,该类型返回关于屏幕显示的通用信息,其中widthPixels属性和heightPixels属性即我们需要的设备分辨率。所以在Android平台游戏启动时或者监听到onConfigurationChanged时我们要使用上述方法得到当前准确的分辨率并应用到游戏中进行适配。

宽高比适配

目前移动设备的主流宽高比有16:9、18:9、19.5:9等,所以需要适配市面上不同宽高比的机型。区别于分辨率适配,宽高比关注的是设备屏幕的长宽比例,通过合适的适配手段来确保在游戏各种宽高比下准确显示,避免出现错位、重叠、显示不全等现象。

常规尺寸适配

我们针对不同的宽高比设定最小内容填充比例16:9和最大内容填充比例19.5:9,宽高比在该范围内时使用通用的锚点适配方案,UI画布随着屏幕拉伸通过锚点定位来自适应(需要美术进行合理的设计)。对部分低于16:9的超宽设备(如iPad等平板设备)进行锁宽,对部分高于19.5:9的超长设备(少部分手机设备)进行锁高,在设定比例范围外的区域进行纯黑色填充。
例如2400x1080(宽高比20:9)的设备,应当进行锁高适配,即保证UI的高度为1080像素,宽度满足最大内容填充比例1080*(19.5/9)=2340像素。而由于我们的设计分辨率是720P,所以按比例对应到UI画布上尺寸则为1560x720单位,示例图如下。

如果是1536*2048 (宽高比4:3)的设备,应当进行锁宽适配,即保证UI的宽度为2048像素,高度满足最小内容填充比例2048/(16/9)=1152像素。根据设计分辨率720P,按比例对应到UI画布上尺寸则为1280x720单位,示例图如下。

如果是2280x1080(宽高比19:9在设定比例范围内)的设备,则直接对UI画布进行等比例适配为1520x720单位。

刘海屏适配

游戏内针对会宽高比超过18:9的设备提供是否开启刘海屏的选项,同时我们也有刘海屏机型白名单,通过SystemInfo.DeviceModel获取的设备型号如果在白名单内,则会直接以刘海屏模式显示而无需提供选项。
在刘海屏适配模式下,我们设定最大不超过18:9的内容区域(即Safe Area),使UI仅显示在内容区域,开启刘海屏模式时画布左右各会各留出60像素(720P的分辨率下的预设刘海高度,取1/12屏宽),画布缩窄后就会确保两侧边缘的UI显示在内容区域内而不被刘海遮挡。Safe Area的示意图如下所示。

对于超出内容区域而没超过最大内容比例的部分,即带刘海的部分,则只显示不含重要信息的背景图或无法交互的装饰。因此游戏中所有的背景图以19.5:9最大内容比例的分辨率输出为720x1560,以确保在最宽显示时依然有背景图来填充屏幕内容,最大化利用屏幕空间。
例如2280x1080(宽高比19:9)的设备在开启刘海屏后,画布左右需各留出1080/12=90像素,此时内容区UI宽度为2280-(2*90)=2100像素,根据设计分辨率720P,按比例对应到UI画布上尺寸则为1400x720单位,示例图如下。

全面屏适配

针对比例超过18:9而不超过19.5:9的设备,如果用户没有开启刘海屏适配,则会使用全面屏适配。出于历史原因,Android默认支持的最大宽高比仅为1.86,不满足我们设定的最大全面屏设备(19.5/9=2.17),所以我们在清单文件AndroidManifest.xml中声明max_aspect值:

<meta-data android:name="android.max_aspect" android:value="2.17"/>

全面屏适配要根据业务和美术的设计需要,美术设计满屏的界面不缩窄画布全屏显示,其它普通UI依然显示在18:9的内容区域内,但处理和刘海屏有差别。UI画布会根据屏幕高度缩窄至刚好18:9的内容区域,而不是两边缩窄固定60像素,以尽可能的铺满屏幕。同样的2280x1080的设备如果没有刘海使用全面屏适配,内容区UI的宽度为1080*(18/9)=2160像素,UI的高度不变,按比例对应到UI画布上尺寸为1440x720单位,而背景图居中显示不受画布尺寸变化的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity屏幕适配解决方案 的相关文章

  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • Input.GetAxis _ Unity3d

    Input GetAxis 获取轴 static function GetAxis axisName string float Description描述 Returns the value of the virtual axis iden
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • Unity3d获得android和ios设备的唯一标识

    android为mac地址 ios为advertisingIdentifier 函数都比较简单 网上也搜得到 我也就不多说了 主要是对于我们没做过安卓和IOS开发的人来说 整合进工程有各种的问题 我也就直接上网盘了点击打开链接 代码包里看得
  • java中Keytool的使用总结

    java中Keytool的使用总结 2011 02 26 15 30 15 分类 在申请Android Map API Key的时候使用到了java中Keytool 下面转一篇介绍java中Keytool的文章 http blog csdn
  • Unity3d + NGUI 的多分辨率适配

    移动端的多机型适配 现在要介绍的是 锁链战记 这款游戏的适配方法 这种适配方法是UI是一个基础尺寸 背景是一个基础尺寸 背景比UI多出的部分是一些没有实际作用的部分 这样的适配方式避免了在iPhone5这样的小屏幕上镶边 首先设定UIRoo
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐

  • 网贷风控体系之-风控模型

    网贷风控体系之 风控模型 大数据风控模型主要分为两类 反欺诈模型 交叉验证 聚类分析 黑灰名单 二元好坏模型 准入阶段 授信额度期限利率模型 评分卡模型 LR XGBoost 贷中阶段 风险变化评估 风险预警 贷后阶段 催收时机 催收方法
  • TVM:源码编译安装

    TVM Linux源码编译安装 笔者环境 OS Ubuntu 18 04 CMake 3 10 2 gcc 7 5 0 cuda 11 1 编译安装过程总览 本文将简介 tvm 的编译安装过程 包含两个步骤 通过C 代码构建共享库 设置相关
  • Android - BlueTooth BLE 之 Central 与 Peripheral

    一 前言 Andorid 5 0 之前是无法进行 外围设备开发的 在Android 5 0 API 21 android bluetooth le包下 新增加 Scaner相关类和 Advertiser 相关类 目前最后使用Scanner相
  • 49天精通Java,第5天,Java控制台输入输出语句

    目录 一 控制台输出 二 读取输入 三 格式化输出 1 类型转换字符 2 代码实例
  • 搭建github服务器_【教程篇】使用GitHub+Hexo搭建个人静态博客

    嗨 大家好 你们的万金油管家小e又来了 这次就教大家一些利用GitHub和Hexo本地服务器搭建个人博客的教程 可能教程要好几期 那么这期就先从最最基础的GitHub的注册 以及本地环境的搭建 GitHub仓库的建立等等开始 近年来很多人都
  • 十大应用安全威胁

    常见应用安全威胁 OWASP TOP 10 2013 注入 失效的身份认证和会话管理 跨站脚本攻击 XSS 不安全的直接对象引用 安全配置错误 敏感信息泄露 功能级访问控制缺失 跨站请求伪造 CSRF 使用含有已知漏洞的组件 未验证的重定向
  • 【MyBatis】MyBatis 二级缓存全详解

    1 概述 转载 MyBatis 二级缓存全详解 上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存 什么是 SqlSession 级别的缓存呢 一级缓存的本质是什么呢 以及一级缓存失效的原因 我希望
  • Ubuntu扩展存储合理分配swap分区

    文章目录 前言 1 为Ubuntu扩存 外部存储 1 1修改存储 1 2 初始化分配的磁盘 2 为Ubuntu调整swap分区大小 总结 前言 我们在Ubuntu上运行某些大型游戏或者编译一些工程代码的时候 往往会遇到内存或外部存储不够导致
  • mac 本地运行 http-proxy-middleware ,请求超时

    const http require http customer target http 10 10 111 192 8080 target http user jinfu baohan com changeOrigin true 是否启用
  • JS如何将变量作为一个对象的Key

    JS如何将变量作为一个对象的Key var lastWord last word var a first word hello lastWord world a first word hello a lastWord world a las
  • Mysql进阶优化篇06——分组查询优化、分页查询优化、覆盖索引

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 mysql基础 进阶 主要讲解mysql数据库sql刷题 进阶知识 包括索引 数据库调优 分库分表等 文章简介 本文将介绍JOIN语句的底层原理
  • Java中通过反射+自定义注解判断对象中部分属性是否为空,返回为空字段的名称或自定义含义

    场景 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出 霸道流氓气质的博客 CSDN博客 在上
  • 【爬虫】python复原网站前端密码加密

    爬虫 python复原网站前端密码加密 前言 前几天学完了尚硅谷的爬虫课程 这几天刚好有一门课出成绩了 我们学校的教务处的查分系统手机无法正常打开 好像只有ios设备用不了 学校的一些学长弄了一个公众号 在公众号里面手机可以很方便的查到分数
  • SMTP服务器地址及端口

    在开发过程中有些场景会用到发送邮件的功能 根据客户需求不同会使用到各种类型的邮箱服务 发送邮件的方法都大同小异 差异大的就是各个邮箱服务的地址及端口 找起来比较麻烦 整理到部分比较常用的可根据需要获取 部分自建的邮箱的SMTP是自定义的 需
  • ARP协议和攻击原理

    转自 https blog 51cto com 13570193 2083332 ARP 在TCP IP协议栈中 最不安全的协议莫过于ARP了 我们经常听到的网络扫描 内网渗透 流量欺骗等等 他们基本上都与ARP有关系 甚至可以说 他们的底
  • 我的ACM生涯——迷失

    自从EC打铁归来已经一星期了了 这一周我都在颓废 似乎又回到以前的自己 没想到 我在集训队呆了2年 还是菜的真实 虽然把所有的原因 都归结到菜上 的确是个逃避问题正解的办法 我决定写点什么总结 算是一个收尾 先来做个回忆 还记得第一次看到自
  • SpringBoot 事件发布监听机制使用、分析、注意点 (一篇到位)

    前言 这一篇从应用角度来跟大伙讲讲 这个 spring 事件监听机制 顺便涉及到那些我认为大家应该一块了解的 我也会展开说说 文章内容 包括不限于 1 对比观察者模式 2 应用场景的分析 3 事件的创建 编码介绍 4 事件如何 发出 5 事
  • ES6:迭代器 Iterator

    迭代器是一个统一的接口 也可以叫遍历器 它的作用是使各种数据结构可被便捷的访问 它是通过一个键为Symbol iterator 的方法来实现 定义一个数组 const people Tom Jerry Mario Yoshi 在控制台打印它
  • 【JavaScript】找出字符串中出现最多的字符及次数

    统计字符串中各个字符的长度 var str dafadfdaaaaaaaaafffffcccccccssssssss var obj for var i 0 i
  • Unity屏幕适配解决方案

    文章目录 UI尺寸选择 市面设备比例 内存占用 分辨率适配 高分辨率 分屏模式 宽高比适配 常规尺寸适配 刘海屏适配 全面屏适配 UI尺寸选择 市面设备比例 截至2017年9月 iOS与Android移动游戏设备比例约为iOS占28 And