目录
一、基本概念
- 作用:摄像机决定了玩家在游戏中能够看到的内容。它就像是玩家的眼睛,从特定的位置和角度观察场景,并将场景中的物体渲染到屏幕上。
- 类型:
- 主摄像机(Main Camera):每个场景通常都有一个主摄像机,它是默认的观察视角。主摄像机的设置对游戏的整体视觉效果起着关键作用。
- 附加摄像机:可以在场景中添加多个附加摄像机,用于实现特定的效果,如分屏显示、小地图等。
二、重要属性
- 位置和旋转:
- 位置决定了摄像机在场景中的坐标。可以通过在编辑器中直接拖动摄像机或者在脚本中修改其 Transform 组件的 position 属性来调整位置。
- 旋转决定了摄像机的观察方向。可以通过在编辑器中旋转摄像机或者在脚本中修改其 Transform 组件的 rotation 属性来调整旋转。
- 视野(Field of View):
- 对于透视摄像机,视野决定了摄像机的观察范围。较大的视野会显示更多的场景,但可能会导致物体变形。较小的视野则会聚焦在较小的区域,适用于需要特写或瞄准的场景。
- 可以在 Inspector 面板中直接调整视野的值,也可以在脚本中通过修改 Camera 组件的 fieldOfView 属性来动态改变视野。
- 清除标志(Clear Flags):
- 用于指定摄像机在渲染画面之前如何清除屏幕。有以下几种选项:
- Skybox:使用天空盒来清除屏幕。这是默认选项,适用于大多数 3D 场景。
- Solid Color:使用单一颜色来清除屏幕。可以在 Inspector 面板中设置清除的颜色。
- Depth Only:只清除深度缓冲区,不清除颜色缓冲区。适用于多个摄像机叠加的场景,以避免画面重叠。
- Don't Clear:不清除屏幕,保留上一帧的画面。这种选项很少使用,可能会导致画面混乱。
- 用于指定摄像机在渲染画面之前如何清除屏幕。有以下几种选项:
- 深度(Depth):
- 摄像机的深度决定了它在渲染顺序中的优先级。深度值较小的摄像机将先渲染,深度值较大的摄像机将在其后渲染。
- 可以在 Inspector 面板中设置摄像机的深度值,也可以在脚本中通过修改 Camera 组件的 depth 属性来动态改变深度。
三、摄像机模式
- 透视模式(Perspective):
- 模拟人眼的视觉效果,物体近大远小。适用于大多数 3D 游戏,能够营造出立体感和深度感。
- 可以调整视野、近裁剪平面和远裁剪平面等参数来控制透视效果。
- 正交模式(Orthographic):
- 没有透视效果,物体在各个方向上的大小相同。适用于 2D 游戏或需要精确尺寸显示的场景,如策略游戏、模拟经营游戏等。
- 可以调整大小(Size)参数来控制正交摄像机的观察范围。
四、脚本控制
可以通过编写脚本来控制摄像机的行为,实现各种动态效果。以下是一些常见的脚本控制方法:
- 摄像机跟随:
- 使摄像机跟随一个特定的目标物体移动,如玩家角色。可以通过计算目标物体的位置和摄像机的位置之间的差值,然后逐渐移动摄像机来实现平滑的跟随效果。
- 以下是一个简单的摄像机跟随脚本示例
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform target;
public float smoothSpeed = 0.125f;
public Vector3 offset;
void LateUpdate()
{
Vector3 desiredPosition = target.position + offset;
Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
transform.position = smoothedPosition;
transform.LookAt(target);
}
}
- 摄像机切换:
- 在不同的场景或情况下切换不同的摄像机视角。可以通过激活和禁用不同的摄像机来实现切换效果。
- 例如,可以在游戏中设置多个摄像机,分别用于主视角、第三人称视角和小地图视角,然后根据玩家的操作或游戏状态切换不同的摄像机。
- oldCamera.enable = false;
- newCamera.enable=true
-
using UnityEngine; public class ExampleScript : MonoBehaviour { public Camera firstPersonCamera; public Camera overheadCamera; // Call this function to disable FPS camera, // and enable overhead camera. public void ShowOverheadView() { firstPersonCamera.enabled = false; overheadCamera.enabled = true; } // Call this function to enable FPS camera, // and disable overhead camera. public void ShowFirstPersonView() { firstPersonCamera.enabled = true; overheadCamera.enabled = false; } }
- 摄像机震动:
- 模拟摄像机的震动效果,如爆炸、撞击等。可以通过在脚本中随机改变摄像机的位置和旋转来实现震动效果。
- 以下是一个简单的摄像机震动脚本示例:
using UnityEngine;
public class CameraShake : MonoBehaviour
{
public float shakeDuration = 0.5f;
public float shakeMagnitude = 0.1f;
private Vector3 originalPosition;
private Quaternion originalRotation;
private float shakeTimer = 0f;
void Start()
{
originalPosition = transform.position;
originalRotation = transform.rotation;
}
void Update()
{
if (shakeTimer > 0)
{
transform.position = originalPosition + Random.insideUnitSphere * shakeMagnitude;
transform.rotation = new Quaternion(
originalRotation.x + Random.Range(-shakeMagnitude, shakeMagnitude),
originalRotation.y + Random.Range(-shakeMagnitude, shakeMagnitude),
originalRotation.z + Random.Range(-shakeMagnitude, shakeMagnitude),
originalRotation.w + Random.Range(-shakeMagnitude, shakeMagnitude)
);
shakeTimer -= Time.deltaTime;
}
else
{
transform.position = originalPosition;
transform.rotation = originalRotation;
}
}
public void Shake()
{
shakeTimer = shakeDuration;
}
}
五、渲染设置
- 层(Layers):
- 可以将场景中的物体分配到不同的层,然后通过摄像机的 Culling Mask 属性来控制哪些层的物体被摄像机渲染。
- 例如,可以将玩家角色和敌人分配到不同的层,然后设置摄像机只渲染玩家所在的层,以提高性能。
- 后期处理(Post-processing):
- Unity 提供了强大的后期处理功能,可以通过添加后期处理效果来增强游戏的视觉效果。例如,可以添加 Bloom(辉光)、Color Grading(色彩分级)、Depth of Field(景深)等效果。
- 可以在摄像机上添加 Post-process Layer 组件,并在项目设置中配置后期处理效果。
六、性能考虑
- 优化渲染:
- 合理设置摄像机的视野和裁剪平面,避免渲染不必要的物体。可以根据游戏的需求调整视野大小,以减少渲染的区域。
- 使用层和 Culling Mask 属性来控制摄像机渲染的物体,只渲染需要显示的物体,提高性能。
- 避免过多的摄像机:
- 过多的摄像机可能会导致性能下降。尽量减少不必要的摄像机,或者在需要时动态激活和禁用摄像机。
- 后期处理效果的性能影响:
- 后期处理效果可能会对性能产生较大的影响。根据游戏的性能需求,合理选择和调整后期处理效果,避免过度使用复杂的效果。
六. 组件详细介绍
名称: | 功能: |
---|---|
清除标志 | 确定将清除屏幕的哪些部分。当使用多个摄像机绘制不同的游戏元素时,这非常方便。 |
背景 | 绘制视图中所有元素后应用于剩余屏幕的颜色,并且没有天空盒 . |
剔除遮罩 | 包括或忽略要由 Camera 渲染的对象层。将图层分配给 Inspector 中的对象。 |
投影 | 切换摄像机模拟透视的功能。 |
透视 | Camera 将渲染透视完好无损的对象。 |
正交 | 摄像机将均匀地渲染对象,没有透视感。注意:Orthographic (正交) 模式不支持延迟渲染。前向渲染 始终使用。 |
大小(选择 Orthographic 时) | 这视窗 size (摄像机的大小) 设置为 Orthographic (正交)。 |
FOV 轴(选择 Perspective 时) | 视野轴。 |
水平 | Camera 使用水平视野轴。 |
垂直 | Camera 使用垂直视野轴。 |
视野(选择 Perspective 时) | 摄像机的视角,沿 FOV Axis 下拉列表中指定的轴以度为单位测量。 |
物理相机 | 勾选此框可启用此摄像机的 Physical Camera 属性。 启用 Physical Camera 属性后,Unity 会使用模拟真实摄像机属性的属性(Focus Length、Sensor Size 和 Lens Shift)来计算 Field of View。 物理摄像机属性在 Inspector 中不可见,直到您勾选此框。 |
焦距 | 设置相机传感器和相机镜头之间的距离(以毫米为单位)。 较低的值会导致 View (视野) 更宽,反之亦然。 更改此值时,Unity 会自动相应地更新 Field of View 属性。 |
传感器类型 | 指定希望摄像机模拟的真实摄像机格式。从列表中选择所需的格式。 选择摄像机格式时,Unity 会自动将 Sensor Size > X 和 Y 属性设置为正确的值。 如果手动更改 Sensor Size 值,Unity 会自动将此属性设置为 Custom。 |
传感器尺寸 | 设置相机传感器的大小(以毫米为单位)。 Unity 会在您选择 Sensor Type 时自动设置 X 和 Y 值。如果需要,您可以输入自定义值。 |
X | 传感器的宽度。 |
Y | 传感器的高度。 |
镜头偏移 | 从中心水平或垂直移动镜头。值是传感器大小的倍数;例如,沿 X 轴偏移 0.5 会使传感器偏移其水平大小的一半。 您可以使用镜头偏移来校正当相机与主体成一定角度时发生的失真(例如,会聚平行线)。 沿任一轴移动镜头,使相机视锥体倾斜。 |
X | 水平传感器偏移量。 |
Y | 垂直传感器偏移量。 |
浇口拟合 | 用于更改分辨率门(游戏视图的大小/纵横比)相对于胶片门(Physical Camera 传感器的大小/纵横比)大小的选项。 有关分辨率门和胶片门的更多信息,请参阅有关物理摄像机的文档。 |
垂直 | 使分辨率门与胶片门的高度相适应。 如果传感器长宽比大于游戏视图长宽比,则 Unity 会在两侧裁剪渲染的图像。 如果传感器长宽比小于游戏视图长宽比,则 Unity 会过扫描侧面的渲染图像。 选择此设置时,更改传感器宽度(传感器大小 > X 属性)不会影响渲染图像。 |
水平 | 使分辨率门适合胶片门的宽度。 如果传感器长宽比大于游戏视图长宽比,则 Unity 会过扫描顶部和底部的渲染图像。 如果传感器长宽比小于游戏视图长宽比,Unity 会裁剪渲染图像的顶部和底部。 选择此设置时,更改传感器高度(传感器大小 > Y 属性)不会影响渲染图像。 |
填补 | 使分辨率门适合胶片门的宽度或高度,以较小者为准。这将裁剪渲染的图像。 |
过扫描 | 使分辨率门适合胶片门的宽度或高度,以较大者为准。这将过度扫描渲染的图像。 |
没有 | 忽略分辨率门,只使用胶片门。这将拉伸渲染的图像以适合游戏视图纵横比 . |
剪切平面 | 从摄像机开始和停止渲染的距离。 |
近 | 将发生绘制的相对于相机最近的点。 |
远 | 将发生绘制的相对于相机的最远点。 |
视口矩形 | 四个值,指示此摄像机视图将在屏幕上的绘制位置。以 Viewport Coordinates (值 0–1) 为单位进行测量。 |
X | 将绘制摄像机视图的起始水平位置。 |
Y | 将绘制摄像机视图的开始垂直位置。 |
W (宽度) | 屏幕上摄像机输出的宽度。 |
H (高度) | 屏幕上摄像机输出的高度。 |
深度 | 摄像机在绘制顺序中的位置。值较大的照相机将绘制在值较小的照相机上。 |
渲染路径 | 用于定义摄像机将使用的渲染方法的选项。 |
使用 Player 设置 | 此摄像机将使用在播放器设置 . |
Vertex Lit | 此摄像机渲染的所有对象都将渲染为 Vertex-Lit 对象。 |
向前 | 所有对象都将使用每个材质的一个通道进行渲染。 |
目标纹理 | 对渲染纹理 ,它将包含 Camera (摄像机) 视图的输出。设置此引用将禁用此摄像机渲染到屏幕的功能。 |
Occlusion Culling | 为此摄像机启用 Occlusion Culling。遮挡剔除意味着隐藏在其他对象后面的对象不会被渲染,例如,如果它们位于墙后。有关详细信息,请参阅 Occlusion Culling。 |
允许 HDR | 为此摄像机启用高动态范围渲染。有关详细信息,请参阅高动态范围渲染。 |
允许 MSAA | 启用多样本抗锯齿 对于此相机。 |
允许动态解析 | 为此摄像机启用 Dynamic Resolution 渲染。看动态分辨率 了解详情。 |
目标显示 | 定义要渲染到的外部设备。介于 1 和 8 之间。 |