23.Camera摄像机组件参数

23.Unity重要组件和API-Camera参数


23.1 知识点

Camera组件信息


  • Clear Flags 清除标志
  • Background 背景
  • Culling Mask 剔除遮罩
  • Projection 投影
  • Clipping Planes 裁剪平面
  • Viewport Rect Viewport矩形
  • Depth 深度
  • Rendering path 渲染路径
  • Target Texture 目标纹理
  • Occlusion Culling 遮挡剔除
  • HDR
  • MSAA
  • Allow Dynamic Resolution 允许动态分辨率
  • Target Display
  • Target Eye

Clear Flags 清除标志

  • 作用:确定将清除屏幕的哪些部分。使用多个摄像机来绘制不同游戏元素时,这会很方便。
  • Skybox 天空盒:主要用来做3D游戏。
  • Solid Color 纯色:2D游戏没必要渲染天空盒,直接选择渲染的颜色,在Background背景里修改颜色。
  • Depth only 仅深度:只画该层,背景透明。配合着深度使用,多个摄像机叠加渲染才会选择的。
  • Don’t Clear 不清除:不移除,覆盖渲染。配合着右键Game窗口tab选择编辑模式下不清除每一帧使用。一般不常用。
    不清除

Background 背景

  • 在绘制视图中的所有元素之后但没有天空盒的情况下,应用于剩余屏幕部分的颜色。
  • 选择背景颜色。

Culling Mask 剔除遮罩

  • 包含或忽略要由摄像机渲染的对象层。在检视面板中将层分配到对象。
  • 选择性渲染部分层级,没被选定的层级不会被当前摄像机渲染。
  • 可以指定只渲染对应层级的对象。

Projection 投影

  • 切换摄像机模拟透视的功能。
Perspective 透视模式:有近大远小效果,一般用于3D游戏制作。
FOV Axis Fov轴:视野轴,决定了光学仪器的视野范围。

  • Vertical 垂直:摄像机使用垂直视野轴。
  • Horizontal 水平:摄像机使用水平视野轴。
Field of view 视野:摄像机视角(以沿着 FOV Axis__ 下拉选单中指定轴的度数为单位)。0-180度之间,一般保持默认60就行。
Physical Camera 物理相机:让摄像机变成物理摄像机,勾选后可以模拟真实世界中的摄像机。
Orthographic 正交模式:没有近大远小效果,一般用于2D游戏制作。
  • Size 大小:视野轴,摄制范围。

Clipping Planes 裁剪平面

  • 开始和停止渲染位置到摄像机的距离。
  • 选择摄像机的裁剪平面距离,对象的位置要在近和远的区间内才能被渲染到。当对象被渲染不到或者模型卡一半都有可能是这个参数造成的。

Viewport Rect Viewport矩形

  • 通过四个值指示将在屏幕上绘制此摄像机视图的位置。在视口坐标中测量(值为 0–1)。
  • 视口范围,屏幕上将绘制该摄像机视图的位置。XYWH范围都是0~1,相当于宽高百分比。XY设置的是当前摄像机渲染的画面在Game窗口的起始位置,宽高是当前摄像机渲染的画面的比例。主要用于双摄像机游戏或者多摄像机游戏。

Depth 深度

  • 摄像机在绘制顺序中的位置。具有更大值的摄像机将绘制在具有更小值的摄像机之上。
  • 渲染顺序上的深度,摄像机深度越小越先被渲染。
  • 场景里存在多个深度不同的摄像机可以理解为,低深度的摄像机先拍了张照片,高深度的摄像机后拍照片叠加覆盖上低深度的摄像机拍的照片上。
  • 一般来说,更高深度的摄像机 Clear Flags 清除标志会选择 Depth only 仅深度,然后选择高深度的摄像机要渲染的层级,这样高深度摄像机其他渲染的层级就会透明,叠加到其他摄像机摄影的图像上。到时候做UI可能会用到专门渲染UI的摄像机。

Rendering path 渲染路径

  • 定义摄像机将使用的渲染方法的选项。

Target Texture 目标纹理

  • 引用将包含摄像机视图输出的渲染纹理。设置此引用将禁用此摄像机的渲染到屏幕功能。
  • 渲染纹理,可以把摄像机画面渲染到一张图上,可以理解为给摄像机添加了一个底片,摄像机的渲染就渲染到底片上。
  • 在Project右键创建 Render Texture 渲染器纹理,把渲染器纹理拖拽到Target Texture 目标纹理上,对应渲染器纹理将显示这个摄像机看到的内容。

  • 主要用于制作小地图,可以创建一个俯视摄像机,把渲染器纹理拖拽到Target Texture 目标纹理上,就可以看场景的俯视显示。

Occlusion Culling 遮挡剔除

  • 为此摄像机启用遮挡剔除 (Occlusion Culling)。遮挡剔除意味着隐藏在其他对象后面的对象不会被渲染,例如,如果对象在墙后面。请参阅遮挡剔除 (Occlusion Culling) 以了解详细信息。
  • 是否启用剔除遮挡,默认勾选,可以理解为被遮挡的对象不被渲染。

HDR

  • 为此摄像机启用高动态范围渲染。请参阅高动态范围渲染以了解详细信息。
  • 是否允许高动态范围渲染。

MSAA

  • 为此摄像机启用多重采样抗锯齿。
  • 是否允许抗锯齿。

Allow Dynamic Resolution 允许动态分辨率

  • 为此摄像机启用动态分辨率渲染。请参阅动态分辨率以了解详细信息。
  • 是否允许动态分辨率呈现。

Target Display

  • 定义要渲染到的外部设备。值为 1 到 8 之间。
  • 当前摄像机用于哪个显示器,主要用来开发有多个屏幕的平台游戏。

Target Eye

  • VR游戏才用到的,选择眼睛如果还是左右。

23.2 练习题

请用两个摄像机实现分屏效果,用之前制作的可以移动的坦克,一个摄像机俯视坦克跟随移动,一个摄像机在炮口位置跟随坦克炮口移动

拉一个坦克预设体,新建炮口摄像机,分别设置好主摄像机和炮口摄像机的Viewport Rect和摄像机位置,把主摄像机设置为坦克子物体,把炮口摄像机设置为坦克头的子物体

合并并细微修改Lesson21练习题和Lesson22练习题脚本,挂载到坦克上操作坦克

#region 练习题一
public float moveSpeed = 50;
public float rotateSpeed = 50;
public Transform head;
public float headRotateSpeed = 50;
public Transform gunTail;
public float gunTailRotateSpeed = 50;
public GameObject mainCamera;
public Transform target;
public float roundSpeed = 50;
#endregion

void Update()
{
    #region 练习题一
    //请用两个摄像机实现分屏效果
    //用之前制作的可以移动的坦克,一个摄像机俯视坦克跟随移动
    //一个摄像机在炮口位置跟随坦克炮口移动

    this.transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical"));
    this.transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime * Input.GetAxis("Horizontal"));
    head.Rotate(Vector3.up * headRotateSpeed * Time.deltaTime * Input.GetAxis("Mouse X"));
    gunTail.Rotate(Vector3.right * gunTailRotateSpeed * Time.deltaTime * Input.mouseScrollDelta.y);
    mainCamera.transform.LookAt(target);
    if (Input.GetMouseButton(1))
    {
        mainCamera.transform.RotateAround(target.position, 
            Vector3.up, 
            roundSpeed * Time.deltaTime * Input.GetAxis("Mouse X"));//速度 Mouse X -1到1 
    }

    #endregion
}

场景上有两个物体A和B,有两个摄像机A和B吗,A摄像机渲染A,B摄像机渲染B,玩家能在Game窗口同时看到A和B

新建两个对象AB,修改层级,再新建两个摄像机,修改Clear Flags 清除标志仅深度模式,并且修改渲染的层级


23.3 练习题代码

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

public class Lesson23_练习题 : MonoBehaviour
{
    #region 练习题一
    public float moveSpeed = 50;
    public float rotateSpeed = 50;
    public Transform head;
    public float headRotateSpeed = 50;
    public Transform gunTail;
    public float gunTailRotateSpeed = 50;
    public GameObject mainCamera;
    public Transform target;
    public float roundSpeed = 50;
    #endregion

    void Update()
    {
        #region 练习题一
        //1.请用两个摄像机实现分屏效果
        //用之前制作的可以移动的坦克,一个摄像机俯视坦克跟随移动
        //一个摄像机在炮口位置跟随坦克炮口移动

        this.transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical"));
        this.transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime * Input.GetAxis("Horizontal"));
        head.Rotate(Vector3.up * headRotateSpeed * Time.deltaTime * Input.GetAxis("Mouse X"));
        gunTail.Rotate(Vector3.right * gunTailRotateSpeed * Time.deltaTime * Input.mouseScrollDelta.y);
        mainCamera.transform.LookAt(target);
        if (Input.GetMouseButton(1))
        {
            mainCamera.transform.RotateAround(target.position, 
                Vector3.up, 
                roundSpeed * Time.deltaTime * Input.GetAxis("Mouse X"));//速度 Mouse X -1到1 
        }

        #endregion

        #region 练习题二
        //2.场景上有两个物体A和B,有两个摄像机A和B
        //A摄像机渲染A,B摄像机渲染B,玩家能在Game窗口同时看到A和B
        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏