分类:Unity、C#、VS2015
创建日期:2016-04-11
一、简介
摄像机(Camera)是为玩家捕捉并展示世界的一种设备。场景中至少需要有一台摄像机,也可以在一个场景中使用多台摄像机。这些摄像机可以设置为在屏幕的任何位置或只在某些部分按任何顺序进行渲染。
要将游戏呈现给玩家,相机是必不可少的。可以对相机进行自定义、脚本化或父子化,从而实现可以想到的任何效果。在拼图游戏中,可以让相机 (Camera) 处于静止状态,以看到拼图的全视图。在第一人称射击游戏中,可以将相机 (Camera) 父子化至玩家角色,并将其放置在与角色眼睛等高的位置。在竞速游戏中,您可能希望让相机追随玩家的车辆。
摄像机类型有两种:
Perspective:透视相机。相机将用完全透视的方式来渲染对象。
Orthographic:正交相机。相机将用无透视感的渲染方法均匀渲染对象。
二、导入Unity自带的摄像机组件
鼠标右击工程视图下的Assets,导入Unity自带的Cameras组件:
此时即可在Standard Assets文件夹下看到导入的四种预设(Prefabs):
使用这些预设的办法很简单,只需要选择某种预设,将其拖放到场景中,并将相机的目标区域设置为root。
1、导入的摄像机类型
下面简单介绍导入的这些相机分类及用途。
(1)FreeLookCameraRig、MultipurposeCameraRig
对于FreeLookCameraRig和MultipurposeCameraRig这两种摄像机来说,“rig”都被设计为跟随的对象总是朝着目标的位置。Camera的偏移量是由高度(Y 轴)的“Pivot”值以及相机的向前偏移值来共同指定的。
l FreeLookCameraRig:这种相机能自动跟随目标位置(鼠标点到哪,目标就跟随到哪),另外还可以通过移动鼠标(或触摸手势)旋转一定的角度。
l MultipurposeCameraRig:这种相机除了能跟随目标位置外,还能先转身,然后再移动到你指定的目标位置,在多人游戏中,该相机非常有用。
这两种Camera的Y轴Pivot(支点)的典型设置都是 2 (在目标上方 2 米),Z轴Pivot的典型设置都是 -6 (在目标后方 6 米)。
如果你想调整Camera朝向目标的某一侧(例如,让第3人称的“转身”,即人或枪在原地转着圈找目标),此时应该调整X轴的Pivot值。
Camera Rig:朝目标移动。
Pivot:调整高度(Y轴相对于X轴的偏移量)。
Camera:调整距离目标的Z轴位置。
这两种相机都使用ProtectCameraFromWallClip.cs文件中的脚本,目的是为了防止相机从场景中的某些项(比如墙或车)中穿越过去。或者说,当它遇到障碍物时,会自动绕着过去而不是直接穿墙而去。
在ProtectCameraFromWallClip脚本中,会不停地检查数据透视(Pivot)和摄像机(Camera)之间的距离,当Camera将要撞到障碍物时,则尝试它应该到哪个位置。由于这个原因,如果你使用的是“wall clip”(墙剪辑)脚本,你无法在运行过程中修改Camera偏移量,因为该脚本会保护它不被修改。
(2)CctvCamera
这种摄像机是一种不带层次结构的GameObject对象,换言之,它只会转身,不会移动。因此,该摄像机不需要墙剪辑脚本。但是,它的目标仍然是tag标记为“player”的对象。
CctvCamera使用的是LookAtTarget脚本,该脚本还提供了Transform.LookAt()函数之外的基本功能。它相对于目标对象的父对象的局部空间,并受其观察角度的约束
这种Camera的用途一般是:呈现开动的汽车侧窗外的场景、从移动的宇宙飞船瞄准一个目标、将目标作为炮塔、……等。
CctvCamera可以放置在任何地方,而且还可以平移实现的目标。
(3)HandholdCamera
手持式摄像机。
2、如何使用摄像机组件
将某个摄像机预设拖放到场景中并将摄像机的目标区域设置为root以后,默认情况下,它就会自动瞄准标记为“Player”的第一个对象。换言之,你只需要将目标的tag标记设置为“Player”就行了。
当你将某个摄像机拖放到场景中以后,创建新场景时自动添加的“Main Camera”已经没用了,可直接删除它。
三、相关属性
Camera是最重要的组件,场景中观察的目标都是靠一台或多台Camera来控制的。所以,必须了解Camera的各种属性及含义,否则你什么可能什么都看不见。
1、Clear Flags
清除标记。确定要清除屏幕的哪些部分。该属性在使用多台Camera绘制不同游戏元素时很方便。可选项有:
(1)skybox
天空盒。这是默认设置。屏幕上所有空白部分都将显示当前相机 (Camera) 的天空盒。如果当前相机 (Camera) 没有设置天空盒,则会默认为渲染设置 (编辑 (Edit) -> 渲染设置 (Render Settings))) 中所选的天空盒。
(2)Solid Color
纯色。选择该模式,屏幕上的空白部分将显示当前摄像机的Background(背景)色。
(3)Depth Only
仅深度。该模式用于游戏对象不希望被裁剪的情况。
如果要绘制玩家的枪而又不让其在环境中被裁剪掉,可以将深度 (Depth)为 0 的相机 (Camera) 设置用于绘制环境,而另一个深度 (Depth)为 1 的相机用于单独绘制武器清除标记 (Clear Flags) 并设置为仅深度模式 (depth only)。这将使得环境图像一直显示在屏幕上,但会丢掉每个对象在三维空间中的位置的所有信息。枪绘制完后,不透明部分将完全覆盖所有已绘制部分,无论枪与墙的距离有多近。
(4)Don't clear
不清除。该模式既不清除颜色,也不清除深度缓存。其结果是,每帧绘制在下一帧之上,形成拖影效果。在游戏中一般与自定义着色器(shader)一同使用。
2、Background
背景。将视线内的所有元素都绘制好且无天空盒之后应用于剩余屏幕的颜色。或者说,在镜头中的所有元素渲染完成但没有指定skybox(天空盒)的情况下,将没置的颜色应用到屏幕的空白处。
3、Culling Mask
剔除遮蔽图,也叫剔除遮罩。即:添加或删除Camera渲染的对象层。
说明:在检视器 (Inspector) 中为对象分配层。通常较好的做法是,将用户界面 (User Interface) 放在不同的层上,然后使其自我渲染,同时用独立的相机 (Camera) 渲染用户界面层。
(1)光斑层。将光斑层 (Flare Layer) 组件附加到相机 (Cameras) 上,可使图像出现镜头光斑 (Lens Flares) 效果。默认情况下,相机已经附加光斑层 (Flare Layer)。
(2)GUI层。将GUI 层 (GUI Layer) 组件连接至相机,可以启用二维 GUI 渲染。GUI 层连接至相机后,将渲染场景中的所有 GUI纹理 (GUI Texture) 和 GUI文本 (GUI Text) 。GUI层不会以任何方式影响 UnityGUI 。 通过点击检视器 (Inspector)中 GUI 层 (GUI Layer) 的复选框可启用或禁用渲染单个相机中的GUI。
另外,为了使 UI 在其他相机 (Camera) 视图上方显示,还需要将清除标记 (Clear Flags) 设置为深度模式 (Depth only) ,并确保 UI 相机 (Camera) 的深度 (Depth) 高于其他相机 (Camera)的深度。
4、Projection
投影方式。切换相机的模拟透视功能。选项有:
Perspective:透视。相机将用完全透视的方式来渲染对象。
Orthographic:正交。相机将用无透视感的渲染方法均匀渲染对象。
将相机 (Camera) 设置为正交 (Orthographic) 会去掉相机视图中的所有透视效果。这在制作等距或二维游戏时非常有用。
注意:雾是使用正交相机模式均匀渲染的,因此可能得不到期待的效果。
5、Size
大小。选择“正交”(Orthographic) 时,设置相机视口的大小。
6、Field of View
视野。选择“透视”(Perspective) 时,Camera视角的宽度,沿局部坐标的 Y 轴进行测量(以度为单位)。
该项仅用于透视模式,用于控制摄像机的视角宽度,以及纵向的角度尺寸。
7、Clipping Planes
裁剪平面。相机开始渲染和停止渲染的距离。选项有:
Near:近点。即将绘制时距离相机最近的点。
Far:远点。即将绘制时距离相机最远的点。
裁剪平面还决定了如何在场景上分布深度缓存的精度。一般而言,为了得到更高的精度,应该将*面 (Near plane) 移得尽可能远。
注意:近、远裁剪平面和相机视野确定的平面一起构成的区域就是俗称的相机平截头体 (frustum)。Unity 会确保在渲染对象时完全在这个平截头体之外的对象不会显示出来。这称之为平截头体剔除 (Frustum Culling)。无论游戏中是否使用了遮挡剔除 (Occlusion Culling),都会出现平截头体剔除 (Frustum Culling)。
出于性能原因,在有些情况下你可能需要尽早剔除小对象(例如,与大型建筑相比,让小石块和碎片在短得多的距离内不可见)。要做到这一点,还需要将小对象放在隔离层中并用 Camera.LayerCullDistances 脚本函数设置每一层的剔除距离。
8、Normalized View Port Rect
规范化视口矩形,或者叫标准视图矩形。用四个数值来控制该摄像机的视图将绘制在屏幕的位置以及大小,该项使用屏幕坐标系(Screen Coordinates),数值在0~1之间。这四个值分别是:
X:绘制相机视图的水平起始位置。
Y:绘制相机视图的垂直起始位置。
W:宽度。相机输出到屏幕上的宽度。
H:高度。相机输出到屏幕上的高度。
规范化视口矩形 (Normalized Viewport Rectangles) 专门用于定义当前相机视图绘制在屏幕上的哪一部分。您可以在屏幕右下角放置地图视图,或者在左上角放置弹头视图。只需一点设计,您就可以利用 视口矩形 (Viewport Rectangle) 创建一些独特的行为。
使用规范化视口矩形 (Normalized Viewport Rectangle)可轻松创建双人分屏效果。创建两个相机后,将两个相机的 H 值都改成 0.5,然后将玩家甲的 Y 值设为 0.5,玩家乙的 Y 值设为 0。这样,玩家甲的相机将从屏幕中间向上显示,而玩家乙的相机将从底部开始并在屏幕中间停止。
下图是使用规范化视口矩形 (Normalized Viewport Rectangle) 创建的双人显示效果:
9、Depth
深度。相机在绘图顺序中的位置。拥有较大值的相机将会绘制在拥有较小值的相机之上。
10、Rendering Path
渲染路径。定义相机使用什么渲染方法。你应该根据游戏内容和目标平台/硬件进行选择,不同的渲染路径有不同的功能和性能特点,这些功能和性能特点主要影响灯光 (Lights) 和阴影 (Shadows)。
(1)Use Player Settings
使用玩家设置中选择项目使用的渲染路径。或者说,该相机将使用玩家设置 (Player Settings) 中设定的任意一个渲染路径 (Rendering Path)。
(2)Vertex Lit
顶点光照。该相机渲染的所有对象都将作为顶点光照 (Vertex-Lit) 的对象来渲染。
(3)Forward
正向渲染。所有对象都将按每种材质一个通道的方式进行渲染。
(4)Deferred Lighting
延时光照(仅限Unity专业版)。所有对象都将无照明绘制一次,用屏幕空间大小的Buffer保存几何体的深度、法线以及高光强度,生成的Buffer将用于计算光照,同时生成一张新的光照信息Buffer;最后所有的游戏对象会被再次渲染,渲染时还会自动叠加光照信息Buffer的内容。
11、Target Texture
渲染的目标纹理(仅限 Unity 专业版)。该项用于将摄像机视图输出并渲染到屏幕。一股用于制作导航图或者画中画等效果。
该功能还可以将相机视图放在可以应用于另一个对象的纹理上。这使得创建体育场大屏幕、监控摄像机和倒影等变得简单。
下图是用于创建直播现场相机的渲染纹理 (Render Texture):
12、HDR
高动态光照渲染范围(High Dynamic Range)。该项用于启用摄像机的高动态范围渲染功能。因为人眼对低范围的光照强度更为敏感,所以使用高动态范围渲染能够让场景更为真实,光照的变化不会显得太突兀。