【转】Unity3D 浅谈 Camera(摄像机)

原文地址:http://www.manew.com/thread-105165-1-1.html

关注公众号,获取更多干货。

二维码

下面是正文:


今天小编和大家一起学习unity中常用组件Camera,在游戏中Camera就是相当眼睛,通过它来看整个游戏的世界,一切酷炫的景象都需要通过Camera来渲染出来;一个场景需要显示画面,也必须至少有一个Camera;

官方文档:https://docs.unity3d.com/Manual/class-Camera.html

1.Camera基本属性定义:

  • 1.0 Clear Flags-清除标记,决定屏幕中哪部分被清除,一般用于多台摄像机来绘制不同对象的情况,一般分为三种模式:

  • 1.0.0 Skybox 天空盒(默认项),在屏幕空白处显示当前摄像机的天空盒,如何没有指定天空盒,则会显示默认的背景色;

  • 1.0.1 Solid Color:当没有天空盒的情况下,将默认显示此处设置的背景色;

  • 1.0.2 Depth Only: 相机深度,该模式用于对象不被裁剪,一般用于需要多台相机层的渲染,例如画中画的显示,我们可以用到这个属性;

  • 1.0.3 Don’t Clear: 不清除,该模式不清楚任何颜色或深度缓存,但这样做每帧渲染的结果都会叠加在下一帧之上,一般与自定义的Shader(着色器)配合使用;

  • 1.1 Culling Mask:剔除遮罩,根据对象所指定的层 (layer)来控制渲染的对象;

  • 1.2 Projection:投影方式,分为透视和正交模式

  • 1.2.0 Perspective(透视):相机将用完全透视的方式来渲染对象[物体会近大远小的效果];

  • 1.2.0.0 Field of view:视野范围(透视模式的参数)

  • 1.2.1 Orthographic(正交):相机没有透视感的方式均匀地渲染对象

  • 1.2.0.1 Size:视野大小 (正交模式的参数)

  • 1.3 Clipping Planes:剪裁平面,摄像机渲染的范围,Near为最近的点,Far 为最远的点;

  • 1.4 Viewport Rect: 视图矩形,用四个数值来控制摄像机的视图在屏幕中的位置和大小,使用屏幕坐标系,数值在0~1之间;

    X:水平位置起点
    Y:垂直位置起点
    W:宽度
    H:高度

  • 1.5 Death: 深度,用于控制摄像机渲染顺序,一般数值大的摄像机将渲染在较小数值的摄像机上;

  • 1.6 Rendering Path:渲染路径,设定摄像机的渲染方法

  • 1.6.0 Use Player Setting:使用Project Setting>Player 中设置;

  • 1.6.1 Vertex Lit: 顶点光照,将所有的对象作为顶点光照对象来渲染;

  • 1.6.2 Forward:快速渲染,摄像机将所有对象做为顶点光照对象来渲染;

  • 1.6.3 DeferredLighting: 延迟光照,先对所有对象进行一次无光照渲染,用屏幕空间大小的Buffer来保存几何体的深度、法线以及高光强度,生成的Buffer用于计算光照,同时生成一张新的光照信息Buffer,最后所有对象再次渲染,渲染时叠加光照信息Buffer的内容,一般此特性用于专业版;

  • 1.7 Target Texture:目标纹理,包含相机视图输出,但是引用这个属性将禁用相机渲染到屏幕的功能;

  • 1.8 HDR:高动态光照渲染,用于启动摄像机高动态范围渲染功能,因为人眼对范围的光照更为敏感,所有高动态范围渲染能让场景变得更为真实,光照的变化不会显得太突兀;

2.重点提一下Camera中的Aspect Ratios 宽高比

  • 2.0 UI适配,例如不同分辨率的设备,我们需要计算不同的Aspect去做适配,例如UGUI中有一个Aspect Ratio Fitter 去动态做显示适配问题;

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

  • 2.2 一般实际的屏幕分辨率与三个尺寸相关:摄像机尺寸,游戏内容尺寸,实际屏幕尺寸;只要确保游戏的有效内容区域和实际内容区域,当游戏启动时,可以根据实际的屏幕宽高比将摄像机尺寸调整到合适游戏的大小;好吧!在这里简单出一个小例子,在正交模式下,调节orthographicsSize保证游戏内容能正常显示;

  • 2.2.0 新建一个TestCamera.cs组件,并且附加在含有Camera组件的对象上;

  • 2.2.1 TestCamera.cs 代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestCamera : MonoBehaviour {


        public float PreSetHeight = 9.6f;
        public float PreSetWidth = 5.4f;
        //宽高比
        public float AspectRatio;
        //屏幕 高度
        public float ScreenHeight;
        //屏幕 宽度
        public float ScreenWidth;
        //摄像机实际宽度
        public float CameraWidth;
        //摄像机实际高度
        public float CameraHeight;

        //正交相机 计算
    // Use this for initialization
    void Start ()
        {

                ScreenHeight = Screen.height;
                ScreenWidth = Screen.width;

                //获取正交视图大小
                float orthographicSize = GetComponent<Camera> ().orthographicSize;

                //计算宽高比
                AspectRatio = ScreenWidth / ScreenHeight;

                //计算摄像机 高度- 摄像机Size*2
                CameraHeight = orthographicSize*2;
                //计算摄像机 宽度- 摄像机Size*2*宽高比(摄像机高度*宽高比)
                CameraWidth = orthographicSize * 2 * AspectRatio;


                if (CameraWidth < PreSetWidth) {
                        orthographicSize = PreSetWidth / (2 * AspectRatio);
                        GetComponent<Camera> ().orthographicSize = orthographicSize;
                }

        }
}

猜你喜欢

转载自blog.csdn.net/Aries_H/article/details/75907047