Unity 3D 屏幕适配全方面解析!

Unity 3D 屏幕适配全方面解析!,第1张

1、游戏屏幕适配

屏幕适配是为了让我们的项目能够跑在各种电子设备上(手机,平板,电脑)

那么了解是适配之前首先要了解两个知识点:

1-1、什么是像素

单位面积中构成图像的点的个数。

特点:单位面积内的像素越多,分辨率越高,图像的效果就越好。

1-2、什么是分辨率?

分辨率可以从显示分辨率与图像分辨率两个方向来分类。

示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少分辨率的单位有:(dpi点每英寸)、lpi(线每英寸)和ppi(像素每英寸)。

特点:

图像的分辨率越高,所包含的像素就越多,图像就越清晰,印刷的质量也就越好。

同时,它也会增加文件占用的存储空间。

1-3、移动设备分辨率 –以iphone 为例

Paste_Imagepng

2、什么是适配

什么是适配?

适应、兼容各种不同的情况

游戏开发中,适配的常见种类

¤系统适配

针对不同版本的 *** 作系统进行适配,例如Unity3D 54系统

¤屏幕适配

针对不同大小的屏幕尺寸进行适配,例如Iphone5s,iphone7

iPhone的尺寸

35inch、40inch、47inch、55inch

iPad的尺寸

79inch、97inch

屏幕方向

竖屏

横屏

3、Unity3D 中的屏幕分辨

3-1

屏幕的宽高比(Aspect Ratio) = 屏幕宽度/屏幕高度

3-2

Unity2D中摄像机镜头的尺寸决定了我们实际看到游戏内容的多少,在编辑器中我们可以通过调整摄像机Camera的orthographicSize属性值来调整摄像机的大小

Paste_Imagepng

注:Unity3D中这个比例的默认值是100,即100像素等于1单位。

如果我们的游戏屏幕有640像素高,那么实际换算成单位高度则是64个单位,

当我们摄像机的orthographicSize值是32时,摄像机大小刚好与屏幕大小相等

4、Unity3D中的屏幕适配设置

4-1:像素适配设置(固定分辨率)

Paste_Imagepng

2、屏幕宽高比

屏幕的宽高比Aspect Ratio = 屏幕宽度/屏幕高度

Paste_Imagepng

5、Unity3D中的摄像机设置

Unity编辑器中只能直接调整摄像机的高度,那摄像机的宽度是如何确定的呢?

答案就是我们最前面提到的屏幕宽高比。Unity会根据当前屏幕实际的宽高比和摄像机的orthographicSize值来计算出摄像机的宽度值,即:

摄像机实际宽度 = 摄像机orthographicSize 2 屏幕宽高比

即是

摄像机实际宽度 = 摄像机高度 屏幕宽高比

我举个例子说明一下,iPhone4的屏幕像素为640960,宽高比为2:3,假设Pixels To Units值为100,那么如果设摄像机高度size值为48,那么摄像机实际宽度按照公式算出64,刚好就是屏幕的单位宽度。

6、Unity3D中的像素比设置

Paste_Imagepng

6、Unity3D:关于适配的一些UI问题解决

这里就是重中之重,也是坑点较多的地方

调整相机为设计尺寸,添加Canvas到场景中进行UI设计,但是Canvas默认大小和相机并不重合。

怎么办?

6-1:办法1:

调整Canvas的Render Mode属性为Screen Space - Camera:

将映射游戏内容的Camera拖入Render Camera中,下一个属性Plane Distance表示UI

与Camera的在Z轴距离(其实就是变相反映了UI的Z轴位置)。

接着在Canvas Scaler属性里将Ui Scale Mode属性设置为Scale With Screen Size,

表示Canvas会根据屏幕比例缩放。

下面的Reference Resolution,表示UI宽和高一半的大小。例如设计尺寸为640x960,

则x应为640 / 2 = 320,宽应为960 / 2 = 480。

下面的Screen Match Mode属性选中Match Width Or Height,表示采用宽度(上文有提到过)

或高度(Unity自带适配方式)适配。然后Match调整为0或1,0表示完全宽度适配,

1表示完全高度适配,其他值表示介于两者之间采用比例适配

Paste_Imagepng

6-2:办法2:

调整Canvas的Render Mode属性为World Space

1、将Event Camera设置为映射游戏内容的Camera。

2、然后调整Rect Transform组件中的Width和Height为设计尺寸的宽和高,同时将Scale属性的X和Y都调整为001(对应unity2d默认情况下像素Pixels与引擎单位Unit对应比例100)。这时,Canvas的宽高正好与摄像机相同。

这两种方法都可以将UI调整为与设计尺寸一致,并且在编辑器中运行与真机中运行效果保持一致。

Paste_Imagepng

6-3:办法3:

给摄像机挂下图脚本就可以搞定比例问题:

Paste_Imagepng

6-4:设定好就如下图所示

Paste_Imagepng

解决屏幕分辨率适配的问题,其实就是解决如何让游戏摄像机尺寸限定在给定范围的问题。

7、适配总结

1游戏有效内容,指游戏中一定需要完整显示在屏幕上的内容;

2游戏实际内容,指全部的游戏内容,包括有效内容和主要是为了适配多分辨率的或其他不重要的目的而增加的内容。

实际的分辨率适配问题与三个尺寸相关,他们分别是:摄像机尺寸,游戏内容尺寸(包括有效内容尺寸和无效内容尺寸)和实际屏幕尺寸。

8、了解游戏中的摄像机

相机(Camera)

是向玩家捕获和显示世界的设备。通过自定义和 *** 纵摄像机,

你可以使你的游戏表现得真正独特。您在场景中摄像机的数量不受限制。

他们可以以任何顺序设定放置在屏幕上的任何地方,或在屏幕的某些部分。

Paste_Imagepng

8-1、摄像机属性:

Paste_Imagepng

Clear Flags 清除标识

确定了屏幕哪些部分将被清除,方便多个摄像机画不同的游戏元素

Paste_Imagepng

Skybox 天空盒:这是默认设置。屏幕上的任何空的部分将显示当前相机的天空盒。

如果当前的相机没有设置天空盒,它会默认在渲染设置(Render Settings )选择天空盒

Solid Color 纯色

任何空部分,屏幕显示为当前相机的背景色。

Depth Only 仅深度

如果你想绘制一个玩家的q,又不让它内部环境被裁剪,你会设置深度为0的相机绘制环境,

和另一个深度为1的相机单独绘制武器。武器相机的清除标志(Clear Flags )应设置 为depth only。

Don't Clear 不清除

此模式不清除颜色或深度缓存。每一帧在下一帧结束后绘制,看上去像是涂抹(smear-looking)的效果。

这在游戏中不常用,最好是在自定义着色器(custom shader)上使用。

Rendering Path-渲染路径

定义什么绘制方法被用于相机的选项

Paste_Imagepng

Use Player Settings 使用玩家设置:在玩家设置(Player Settings)相机使用哪个渲染路径。

Vertex Lit 顶点光照 :所有被这个相机渲染的物体都将渲染成Vertex-Lit物体。

Forward 正向渲染:所有对象每材质渲染只渲染一次,和Unity 2x中的标准一样

Deferred 延迟照明:所有物体将在无光照的环境渲染一次,然后在渲染队列尾部将物体的光照一起渲染出来。

Traget Texture-目标纹理:

Paste_Imagepng

渲染纹理 (Render Texture)包含相机视图输出。这会使相机渲染在屏幕上的能力被禁止。

补充:Vertex Lit:顶点光照

这个Shader是Vertex-Lit,是最简单的Shader之一。这个Shader渲染代价是非常小的

所有照射在该物体上的光源通过一次光能传递渲染完成并且只计算顶点光源。

因为是Vertex-Lit,所以不会有任何基于像素渲染的效果,例如:Light Cookies,Normal Mapping

和Shadows。这个Shader对模型的细分同样更加敏感,假如在很靠近立方体的地方放置一个

点光源,并且应用这个Shader,这个光源只会在此角落进行计算

General shader performance 通常的着色器性能

Unlit This is just a texture, not affected by any lighting�不发光。这只是一个纹理,不被任何光照影响

VertexLit 顶点光照

Diffuse 漫反射

Normal mapped �法线贴图,比漫反射更昂贵:增加了一个或更多纹理(法线贴图)和几个着色器结构

Specular This adds specular highlight calculation �高光。这增加了特殊的高光计算

Normal Mapped Specular Again, this is a bit more expensive than Specular �高光法线贴图。这比高光更昂贵一点

Parallax Normal mapped This adds parallax normal-mapping calculation �视差法线贴图。这增加了视差法线贴图计算

Parallax Normal Mapped Specular�视差高光法线贴图。这增加了视差法线贴图和镜面高光计算

链接:>

网上不是有很多适配iphone x的吗?你适配一下。另外unity里也有判断运行设备是不是iphone x的,你也可以手动在unity中项目中判断iphone x然后自己适配。这是判断的方法:

>控制角色移动播放动作或者其他逻辑则需要给这个橘色节点绑定逻辑脚本,UNity支持多种脚本语言,在此是用JAVA脚本
创建 脚本Assets --> Create ----> JavaScript 创建一个空的逻辑脚本,并将这个脚本绑定在主角对象身上,绑定方式是直接拖拽到主角节点即可。
对脚本的编写:
类及接口主要参照帮助文档,这里只介绍脚本基本结构和简单示例:
每个脚本至少都有两个函数: function Start() 可以认为是初始化 function Updata()则是每帧更新函数。
要实现对角色位置的控制移动首先要定义该角色,
首先 定义GameObject对象也就是要控制的目标: private var _MainRole:GameObject;;
在function Start() 函数中初始化该对象: inRole = GameObjectFind("MainRole"); // 从场景中查找到名叫"MainRole"的对象也就是主角。
在每帧更新时侦听键盘事件,如果按键按下W则空对象向前移动
if(InputGetKey(KeyCodeW))
{
_MainRoletransformTranslate( Vector3forward 005 );
}
至此,就已经完成按键控制角色移动的全部过程,运行游戏就可以用按键控制角色移动。

IOS:
IOS:使用shell命令打包并上传Itunes
Unity3d:
Unity3d:Canvas适配屏幕分辨率与锚点(Anchors与Pivot)
Unity3d:在屏幕边缘显示其他玩家方位
Unity3d:命令行打包Android
Unity3d:命令行编译IOS
Unity3d:使用Jenkins自动编译打包IOS(只能打包Development)
Unity3d:使用Jenkins自动编译打包IOS(打包Ad-hoc,上传itunes)

所有的UI都有一个Root Canvas,该Canvas的RectTransform不可修改。
所有 Canvas坐标系 方向都是 右侧为X轴正方向 上方为Y轴正方向
该Canvas还带有一个 Canvas Scaler 组件,可以通过该组件适配不同的屏幕分辨率。

Canvas Scaler 中有一个 UI Scale Mode 属性,用于确定画布中的UI元素如何缩放。

以下假如屏幕分辨率为1500 3000。

使Canvas宽高保持与屏幕分辨率一致。屏幕分辨率有多大,Canvas宽高就有多大( Scale Factor 缩放因子为1时)。

所以, Canvas宽高 = 屏幕分辨率 / 缩放因子

使Canvas的宽高比与屏幕分辨率的宽高比保持一致。
缩放时需要基于下面的 Reference Resolution(参考分辨率) 进行缩放。
因为此时屏幕分辨率的宽高比为:1500 / 3000 = 05,所以在该模式下,无论怎么调整参数,Canvas宽高比也一直为05,不会变。
所以, Canvas宽高比 = 屏幕分辨率宽高比

缩放时用的参考分辨率。
下面假设参考分辨率是1080 1920。

如果屏幕分辨率与参考分辨率的宽高比不一致,则根据选择的模式对Canvas宽高进行缩放。
如果屏幕分辨率与参考分辨率的宽高比一致,该选项怎么调都不管用。

基于下面 Match 对Canvas宽高进行缩放。

缩放后,Canvas的宽高一定不低于参考分辨率的宽高。

缩放后,Canvas的宽高一定不高于参考分辨率的宽高。与 Expand 类似。

锚点说难不难,只是不好描述,但可以用例子来说明。
假如Canvas拥有一个Image节点。
对于 Image所在的坐标系 坐标系方向与Canvas坐标系方向相同

下面看下Image节点的 锚点在Canvas的不同位置 的情况:

单锚点 ,从Unity上看,就是4个小三角形聚在一个点。
单锚点在Canvas的位置(假设为点p) 都满足以下逻辑:

可以总结出以下公式(p为单锚点在Canvas的位置,pivot为单锚点的Pivot属性):
Image所在坐标系 原点在Canvas中的坐标 = (px + ImageWidth (05 - pivotx), py + ImageHeight (05 - pivoty))

双锚点 ,从Unity上看,就是2个小三角形聚在一个点。

左上角有2个小三角形,左下角有2个小三角形
此时,Image拥有 PosX,Top,Width,Bottom 这四个位置参数。
而且, 锚点的Pivot的Y不起作用
Image的Height = (CanvasHeight - Top - Bottom) / 2
如果设置Image的Top,Bottom都为0的话,则Image的高会与Canvas的高一致。
Image所在坐标系原点在Canvas中的坐标 = (ImageWidth (05 - Pivotx) + PosX , ImageHeight / 2 + Top)

底部边框的中心有2个小三角形,顶部边框的中心有2个小三角形
此时,Image拥有 PosX,Top,Width,Bottom 这四个位置参数。
而且, 锚点的Pivot的Y不起作用
Image的Height = (CanvasHeight - Top - Bottom) / 2
如果设置Image的Top,Bottom都为0的话,则Image的高会与Canvas的高一致。
Image所在坐标系原点在Canvas中的坐标 = (ImageWidth (05 - Pivotx) + CanvasWidth / 2 + PosX , ImageHeight / 2 + Top)

右上角有2个小三角形,右下角有2个小三角形
此时,Image拥有 PosX,Top,Width,Bottom 这四个位置参数。
而且, 锚点的Pivot的Y不起作用
Image的Height = (CanvasHeight - Top - Bottom) / 2
如果设置Image的Top,Bottom都为0的话,则Image的高会与Canvas的高一致。
Image所在坐标系原点在Canvas中的坐标 = (ImageWidth (05 - Pivotx) + CanvasWidth + PosX , ImageHeight / 2 + Top)

左上角有2个小三角形,右上角有2个小三角形
此时,Image拥有 Left,PosY,Right,Height 这四个位置参数。
而且, 锚点的Pivot的X不起作用
Image的Width = (CanvasWidth - Left - Right) / 2
如果设置Image的Left,Right都为0的话,则Image的宽会与Canvas的宽一致。
Image所在坐标系原点在Canvas中的坐标 = (ImageWidth / 2 + Left , ImageHeight (05 - Pivotx) + PosY)

左侧边框的中心有2个小三角形,右侧边框的中心有2个小三角形
此时,Image拥有 Left,PosY,Right,Height 这四个位置参数。
而且, 锚点的Pivot的X不起作用
Image的Width = (CanvasWidth - Left - Right) / 2
如果设置Image的Left,Right都为0的话,则Image的宽会与Canvas的宽一致。
Image所在坐标系原点在Canvas中的坐标 = (ImageWidth / 2 + Left , ImageHeight (05 - Pivotx) + CanvasHeight / 2 + PosY)

左下角有2个小三角形,右下角有2个小三角形
此时,Image拥有 Left,PosY,Right,Height 这四个位置参数。
而且, 锚点的Pivot的X不起作用
Image的Width = (CanvasWidth - Left - Right) / 2
如果设置Image的Left,Right都为0的话,则Image的宽会与Canvas的宽一致。
Image所在坐标系原点在Canvas中的坐标 = (ImageWidth / 2 + Left , ImageHeight (05 - Pivotx) + CanvasHeight + PosY)

四锚点 ,从Unity上看,就是4个小三角形全都是分散的( 左下角、左下角、右上角、右下角 )。
此时,Image拥有 Left,Top,Right,Bottom 这四个位置参数。
而且, 锚点的Pivot不起作用
Image的Width = (CanvasWidth - Left - Right) / 2
Image的Height = (CanvasHeight - Top - Bottom) / 2
如果设置Image的Left,Top,Right,Bottom都为0的话,则Image的宽高会与Canvas的宽高一致。
Image所在坐标系原点在Canvas中的坐标 = (ImageWidth / 2 + Left , ImageHeight / 2 + Top)

屏幕坐标系与Canvas坐标系都是 左下角为原点,向右为X轴正方向,向上为Y轴正方向

在屏幕坐标系上有个点P(x, y),我们先把屏幕分辨率的宽高缩放到与Canvas的宽高一致,此时P点的坐标也会随着缩放。
因为屏幕坐标系与Canvas坐标系都是左下角为原点,所以缩放完成后的P的位置(记作P2),就是P点在Canvas坐标系上的位置。
P2 = (Px CanvasWidth / ScreenWidth, Py CanvasHeight / ScreenHeight)
现在有一个Image UI,我们先把该Image的锚点设置为左下角( AnchorsMin(0, 0),AnchorsMax(0, 0) ),然后把P2的位置赋值给Image的anchoredPosition,此时该Image刚好就在P点的位置。

在Canvas坐标系上有一个Image UI,我们先把该Image的锚点设置为左下角( AnchorsMin(0, 0),AnchorsMax(0, 0) ),然后把Canvas的宽高缩放到与屏幕分辨率的宽高一致,此时Image的anchoredPosition(记作P)也会随着缩放。
因为屏幕坐标系与Canvas坐标系都是左下角为原点,所以缩放完成后的Image的anchoredPosition(记作P2),就是Image在屏幕坐标系上的位置。
P2 = (Px ScreenWidth / CanvasWidth, Py ScreenHeight / CanvasHeight)

分辨率不是在这里调的,这里是开发环境的最大分辨率,方便开发用的,在调质量那里调最终质量,包括抗锯齿什么的,不过的清晰与否,不一定是这个原因,也可能你的type选的不对,unity默认的texture不是最清晰的,只是比较省而已

选择 Default—MaxSize 分辨率调到最大
原因分析,的本身分辨率就是一万以上了,当在unity使用时,分辨率设置为1024,所以导致模糊,当调高分辨率后就清晰了,
弊端: 分辨率越高 占用内存越大,例如我这个长图,1024分辨率是才3600KM,调整到8192分辨率时高达226MB,一张占用几十MB,实在是太大了,


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/13344005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-18
下一篇 2023-07-18

发表评论

登录后才能评论

评论列表(0条)

保存