2018-06-06 15:54:03 q764424567 阅读数 418

感觉这篇文章不错,转过来跟大家分享

原文作者:雷潮
原文链接:https://www.jianshu.com/p/95cb4621206e
原文來源:简书

1、游戏屏幕适配

屏幕适配是为了让我们的项目能够跑在各种电子设备上(手机,平板,电脑)
那么了解是适配之前首先要了解两个知识点:

1-1、什么是像素?

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

1-2、什么是分辨率?

分辨率可以从显示分辨率与图像分辨率两个方向来分类。
示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少.分辨率的单位有:(dpi点每英寸)、lpi(线每英寸)和ppi(像素每英寸)。
特点:
图像的分辨率越高,所包含的像素就越多,图像就越清晰,印刷的质量也就越好。
同时,它也会增加文件占用的存储空间。

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

这里写图片描述

2、什么是适配?

什么是适配?

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

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

¤系统适配
针对不同版本的操作系统进行适配,例如Unity3D 5.4系统

¤屏幕适配
针对不同大小的屏幕尺寸进行适配,例如Iphone5s,iphone7
iPhone的尺寸
3.5inch、4.0inch、4.7inch、5.5inch
iPad的尺寸
7.9inch、9.7inch
屏幕方向
竖屏
横屏

3、Unity3D 中的屏幕分辨

3-1.

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

3-2.

Unity2D中摄像机镜头的尺寸决定了我们实际看到游戏内容的多少,在编辑器中我们可以通过调整摄像机Camera的orthographicSize属性值来调整摄像机的大小
这里写图片描述
注:Unity3D中这个比例的默认值是100,即100像素等于1单位。
如果我们的游戏屏幕有640像素高,那么实际换算成单位高度则是6.4个单位,
当我们摄像机的orthographicSize值是3.2时,摄像机大小刚好与屏幕大小相等

4、Unity3D中的屏幕适配设置

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

这里写图片描述

4-2、屏幕宽高比

屏幕的宽高比Aspect Ratio = 屏幕宽度/屏幕高度
这里写图片描述

5、Unity3D中的摄像机设置

Unity编辑器中只能直接调整摄像机的高度,那摄像机的宽度是如何确定的呢?
答案就是我们最前面提到的屏幕宽高比。Unity会根据当前屏幕实际的宽高比和摄像机的orthographicSize值来计算出摄像机的宽度值,即:
摄像机实际宽度 = 摄像机orthographicSize * 2 * 屏幕宽高比
即是
摄像机实际宽度 = 摄像机高度 * 屏幕宽高比

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

6、Unity3D中的图片像素比设置

这里写图片描述

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

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

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

怎么办?

7-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表示完全高度适配,其他值表示介于两者之间采用比例适配
这里写图片描述

7-2:办法2:

调整Canvas的Render Mode属性为World Space
1、将Event Camera设置为映射游戏内容的Camera。
2、然后调整Rect Transform组件中的Width和Height为设计尺寸的宽和高,同时将Scale属性的X和Y都调整为0.01(对应unity2d默认情况下像素Pixels与引擎单位Unit对应比例100)。这时,Canvas的宽高正好与摄像机相同。
这两种方法都可以将UI调整为与设计尺寸一致,并且在编辑器中运行与真机中运行效果保持一致。
这里写图片描述

7-3:办法3:

给摄像机挂下图脚本就可以搞定比例问题:
这里写图片描述

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

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

8、适配总结

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

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

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

9、了解游戏中的摄像机

相机(Camera)
是向玩家捕获和显示世界的设备。通过自定义和操纵摄像机,
你可以使你的游戏表现得真正独特。您在场景中摄像机的数量不受限制。
他们可以以任何顺序设定放置在屏幕上的任何地方,或在屏幕的某些部分。
这里写图片描述

9-1、摄像机属性:

这里写图片描述

Clear Flags 清除标识

确定了屏幕哪些部分将被清除,方便多个摄像机画不同的游戏元素
这里写图片描述
Skybox 天空盒:这是默认设置。屏幕上的任何空的部分将显示当前相机的天空盒。
如果当前的相机没有设置天空盒,它会默认在渲染设置(Render Settings )选择天空盒

Solid Color 纯色
任何空部分,屏幕显示为当前相机的背景色。
Depth Only 仅深度
如果你想绘制一个玩家的枪,又不让它内部环境被裁剪,你会设置深度为0的相机绘制环境,
和另一个深度为1的相机单独绘制武器。武器相机的清除标志(Clear Flags )应设置 为depth only。
Don’t Clear 不清除
此模式不清除颜色或深度缓存。每一帧在下一帧结束后绘制,看上去像是涂抹(smear-looking)的效果。
这在游戏中不常用,最好是在自定义着色器(custom shader)上使用。

Rendering Path-渲染路径

定义什么绘制方法被用于相机的选项
这里写图片描述
Use Player Settings 使用玩家设置:在玩家设置(Player Settings.)相机使用哪个渲染路径。
Vertex Lit 顶点光照 :所有被这个相机渲染的物体都将渲染成Vertex-Lit物体。
Forward 正向渲染:所有对象每材质渲染只渲染一次,和Unity 2.x中的标准一样
Deferred 延迟照明:所有物体将在无光照的环境渲染一次,然后在渲染队列尾部将物体的光照一起渲染出来。

Traget Texture-目标纹理:

这里写图片描述
渲染纹理 (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..�视差高光法线贴图。这增加了视差法线贴图和镜面高光计算

http://www.ceeger.com/Components/shader-NormalVertexLit.html
http://www.ceeger.com/Components/shader-Performance.html

2014-09-26 16:56:02 hxmxbox 阅读数 7281

在网上搜了好多资料关于如何自适应各种繁杂平台的手机屏幕分辨率,找到了一个关键词UIRoot,于是乎去下载了NGUI插件,这是一个Unity3D上开发2D游戏最好的插件了。

教程环境:Unity4.5.1f3, NGUI v3.7.1。若界面有所差别,请自行领悟!

NGUI百度百科定义:NGUI是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件,提供强大的UI系统和事件通知框架。其代码简洁,多数类少于200行代码。

1. 下载NGUI Next-Gen UI v3.7.0

2. 导入NGUI package到Unity。

custom-package

这时候菜单上会出现NGUI的菜单栏:

NGUIcaidan

3. 将默认的Main Camera删掉,通过菜单栏NGUI->Create新建一个2D UI对象。

unity3d-2dui

此时创建了一个UI Root以及子对象Camera(这就是为什么要删除默认的摄像头),这个摄像头自带了NGUI的UICamera脚本,这个脚本的作用是来响应各种事件的。

unity3d-uiroot-camera

4. 设置UI Root属性,点击UI Root,此时在右侧的Inspector面板可以看到其相关属性,这里很关键!选择Scaling Style为ConstrainedOnMobiles,这个是专门为手机分辨率设计的选项,此时下面有两个属性,勾选Content Width和Content Height,并设置你最期望的屏幕分辨率,一般会是你背景图片的分辨率,这样UI Root下的子元素就会根据手机的分辨率等比例缩放!注意下图的官方说明。

unity-uiroot-scalingstyle

5. 你会发现这个新的Camera看不到你创建的物体,需要设置摄像头为可视摄像头。点击Camera,在右侧的Inspector面板会看到Camera的属性,设置以下两个属性:

Culling Mask:选Everything(这个非常重要,这样才能看到你的物体)。

Clear Flags: 选Skybox

unity-camera-cullingmask

6. 通过NGUI创建一个Texture对象当作背景图片,这一步非常重要!之前博主在这边卡了好长时间。只有在UI Root下并且是NGUI的对象才能应用到UI Root的Scaling Style功能!(当然,应该还有博主没摸清的地方。)

unity-texture-gbSetting

7. 好了,检查下Game视图,看看是不是生效了呢:)下面放几张有代表性的图。

注意:以后添加的所有对象都应该在UI Root下,这样才能跟着背景图片等比例缩放!

分辨率:1280*800(16:10),上下填充黑边。

unity-1280-800-16-10

分辨率:1920*1080(16:9),完美填充,无黑边!

unity-1080p

分辨率:800*400(2:1),左右填充黑边。

unity-400p


手机竖屏设置,参考Unity3D 手机竖屏设置(For Android)

 

转载请注明:ShirlmanBlog » 最明白的Unity3D手机平台分辨率自动匹配教程-适合新手

2013-01-31 10:57:49 zc1415926 阅读数 1795
    Device Orientation这里个人译为设备姿态,就是说你的设备是竖着的,横着的,还是趴下的?    在Unity3D中定义了七种设备姿态,分别为Portrait, PortraitUpsideDown, LandscapeLeft, LandscapeRight, FaceUp, FaceDown, Unknown。前四种姿态如图所示,FaceUP就是平放在桌面,屏幕冲天(或天花板)的姿态,不过不一定是在桌上,FaceDown和FaceUp相反,是屏幕冲地,Unknown就是不晓得当前设备姿态或无法获取设备姿态。




    如何判断设备姿态呢?这里要使用到Input.deviceOrientation变量获取设备姿态,它是只读的,也就是说你不要想着改变它的值来强制改变屏幕的方向了。获取了 Input.deviceOrientation 的值以后呢?当然是和DeviceOrientation 枚举中的DeviceOrientation.Portrait, DeviceOrientation.LandscapeLeft等进行比较进行判断了,DeviceOrientation枚举请参考官方手册
    举个例子说吧:

if (Input.deviceOrientation == DeviceOrientation.FaceDown)
{
            //这里做点儿什么
}
    学会了吧!    顺便说一下,要是想使用代码改变屏幕方向可以参考如下手册内容,方法与上边类似。
http://docs.unity3d.com/Documentation/ScriptReference/Screen-orientation.html
http://docs.unity3d.com/Documentation/ScriptReference/ScreenOrientation.html
2017-08-11 15:20:24 lr123838 阅读数 2206

为什么标题写着unity2d而不是unity3d呢?这是博主对于3d还没入门,只能入门2d游戏开发。。。简单点上手先。。。

一开始没注意,新建一个Image,放张背景上去,把Image宽高拉到画布大小,以为跑出来会是占满屏幕吧,结果是竖屏的,还不能旋转,宽好像占满了。。竖屏的问题找了下Build Settings-Player Settings-Inspector里面设置这里写图片描述
就这样,横屏效果出来了。关于Image没有充满屏幕的问题,在百度上找了下发现不知道网上说了什么,感觉很厉害,然而对面级别有点高,逃命吧。最后看了一下公司的一个项目,看到了Canvas和Image的宽高设置:
这里写图片描述
canvas设置1334*750,上面的是Image的设置。
感觉unity3d游戏开发学习之路任重而道远啊!

2017-09-12 17:25:00 Lyon_Nee 阅读数 1164

将脚本直接挂在当前想要通过手势旋转的摄像头或其他游戏物体上.


using UnityEngine;

public class TouchTest : MonoBehaviour
{
    public float xSpeed = 100;//旋转速度
    public float ySpeed = 100;
    public float yMinLimit = -20;//旋转限制
    public float yMaxLimit = 80;
    public float x = 0.0f;
    public float y = 0.0f;
    void Start()
    {
        Vector2 angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
    }

    void Update()
    {
        if (Input.touchCount == 1)
        {
            if (Input.GetTouch(0).phase==TouchPhase.Moved)
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
            }
        }
    }

    public void LateUpdate()
    {
        y = ClampAngle(y, yMinLimit, yMaxLimit);
        Quaternion rotation = Quaternion.Euler(y, x, 0);
        transform.rotation = rotation;

    }

    /// <summary>
    /// Y值的限制
    /// </summary>
    float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;

        if (angle > 360)
            angle -= 360;

        return Mathf.Clamp(angle, min, max);
    }
}


没有更多推荐了,返回首页