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