
2.5 Unity的光照
2.5.1 灯光的类型
我们知道灯光是游戏场景中不可或缺的部分,可以用来模拟手电筒、太阳、月亮等,起着照明、烘托气氛、物体表现等很重要的作用。在Unity中为用户提供了4种常用的灯光,分别是“Directional Light”(方向光)、“Point Light”(点光源)、“Spot Light”(聚光灯)、“Area Light”(区域光),下面分别讲述这几种光源。
(1)“Directional Light”是场景中主要的光源之一,如图2-32所示。这种光源放在场景中的任何位置,场景中的物体都会被照亮。不论物体与方向光的距离远近,都不会对光线产生衰减。只有旋转方向光的时候,灯光的方向才会受到影响。在一般情况下,每一个Unity的场景中都会有方向光,作为场景中的主光源,场景中的阴影也是由其产生的。方向光可以用来模拟场景中的太阳光与月光。例如,场景中的日出日落效果就是通过调整方向光的角度、光线强度、光线颜色来实现的。

图2-32 场景中的Directional Light
(2)“Spot Light”如图2-33所示。光源被约束在一个圆形的范围内,而且光线是有方向性和衰减性的。圆锥形范围外的物体将极少受此灯光的影响,而且光线在这个圆锥形范围内会慢慢地变弱。这种灯光一般用来模拟人造光源,例如在场景中配合脚本控制灯光的开关及角度可以完美地模拟汽车的远光灯、近光灯,也可以用来模拟手电筒、家中的床头灯等。

图2-33 场景中的Spot Light
(3)“Point Light”如图2-34所示。点光源是位于空间中的一个点,并向各个方向均匀地发光。我们可以把点光源想象成一个球形的物体,越接近球形中心,光线越强;越接近球形边缘,光线越弱。在场景中,可以用来模拟家中的灯泡、汽车的尾灯、爆炸等。

图2-34 场景中的Point Light
(4)“Area Light”如图2-35所示。此种光源只有在烘焙了的情况下才能起作用,它的范围是可以自定义的矩形框,并带有指定的方向。光源的强度会随着物体的距离而衰减,这种光源的阴影比上面的三种光源的阴影更加柔和,可以模拟小面积的光源,比点光源更加逼真。

图2-35 场景中的Area Light
接下来介绍如何创建和设置这些灯光的参数。可以在Hierarchy面板中单击“Create”按钮,在下拉菜单中的“Light”选项中选择需要创建的灯光类型,在Inspector面板中设置参数。这里以“Spot Light”聚光灯为例进行介绍,如图2-36所示,其他类型的灯光参数也是大同小异。

图2-36 灯光设置
- Type:灯光的类型。
- Spot:聚光灯。
- Directional:方向光。
- Point:点光源。
- Area(baked only):区域光。
- Baking:作用方式。
- Realtime:实时光照,烘焙场景时将不被烘焙。
- Baked:烘焙光照。
- Mixed:混合光照。
- Range:光照范围。
- Spot Angle:光照角度。
- Color:光照颜色。
- Intensity:光照强度。
- Bounce Intensity:灯光二次反弹强度。
- Shadow Type:阴影类型。
- No Shadows:不产生阴影。
- Hard Shadows:硬阴影。
- Soft Shadows:软阴影。
- Strength:阴影的浓度。
- Resolution:阴影质量设置,分为游戏设置中的低、中、高、非常高4种等级质量。
- Bias:阴影的偏移值。
- Normal Bias:偏移值,调整位置和定义阴影。
- Shadow Near Plane:定义接近地面呈现的阴影裁切。
- Cookie:设置一张贴图,以贴图的透明通道为蒙板,灯光照射到地面就会产生对应的光影效果。
- Draw Halo:是否显示光晕。
- Flare:光斑,例如镜头光晕。
- Render Mode:渲染的模式。
- Auto:自动。
- Important:重要,逐像素渲染,比较消耗性能,常用于场景中一些比较重要的效果。
- Not Important:不重要,以顶点、对象方式进行渲染,渲染速度比较快。
- Culling Mask:灯光遮罩,可以选择某些“Layers”层级,不受灯光影响。
2.5.2 环境光与天空盒
在Unity中,除了2.5.1小节中所提到的常用的4种灯光外,还有一种比较常见的全局灯光设置“Ambient”(环境光),可以用来调整场景中光线的整体亮度、颜色等。设置环境光有三个选项,如图2-37中的“Ambient Source”(环境光来源)所示。

图2-37 环境光
- Skybox:天空盒,在这种模式下,我们可以通过调整“Ambient Intensity”(环境光强度)来提亮或调暗场景,但环境光的颜色还是保持天空盒的颜色。
- Gradient:渐变模式,在这种模式下,用户可以选择三种不同的颜色,以这三种颜色的渐变构成环境光。三种颜色的含义分别为“Sky Color”(天空色)、“Equator Color”(地平面色)、“Ground Color”(大地的颜色),如图2-38所示。我们可以通过调整三种颜色来改变整个环境光,如图2-39所示。

图2-38 渐变模式

图2-39 Gradient渐变模式
- Color:颜色模式,在这种模式下,用户可以自定义环境光颜色及强度,其效果如图 2-40所示。

图2-40 Color模式
提示
由于本书是黑白印刷,无法区分色彩,因此要区分色彩的图可参考下载文件中的图片。
在场景中,天空盒也是不可或缺的部分。介绍天空盒之前,必须先说说天空盒材质。在Unity中,天空盒材质可以大致分为三种类型:“6 Sided”(6面贴图)、“Cubemap”(立方体贴图)、“Procedural”(合成贴图)。创建方式为新建材质球,选择材质球的着色器为“Skybox”,然后选择不同的类型,如图2-41所示。下面介绍常用的两种天空盒材质球:6 Sided和Cubemap。

图2-41 创建天空盒材质球
- 6 Sided
步骤01 导入6张用于制作天空盒的贴图,如图2-42所示(素材路径为 2/2.5.2/素材/Skybox . unitypackage)。
步骤02 选中6张贴图,在Inspector面板中,将纹理循环模式从“Repeat”改为“Clamp”,否则贴图的边缘颜色将会不匹配,如图2-43所示。

图2-42 天空盒贴图

图2-43 天空盒贴图设置
步骤03 将6张贴图贴入材质球的对应位置,如图2-44所示。

图2-44 设置天空盒材质
- Cubemap
步骤01 导入一张适合的高动态范围图(素材路径为2/2.5.2/素材/CubeMap.hdr)。
步骤02 选中贴图,在Inspector面板中设置贴图的形状为“Cube”(立方体)、“Wrap Mode”(纹理循环模式)为“Clamp”,如图2-45所示。
步骤03 将贴图贴入材质球的对应位置,如图2-46所示。

图2-45 设置贴图类型

图2-46 设置贴图
接着就可以在场景中使用新建的天空盒材质球了。在Unity中,设置天空盒时有两种方式:一种是针对整个场景的天空盒(全局天空盒),另一种是针对某个单独相机的天空盒(针对相机的天空盒)。二者的区别在于,若使用前者,则不论使用场景中的哪个相机观看都是同一个天空,而后者针对不同的相机,观看的天空可能是不一样的。
- 全局天空盒
打开菜单栏上的“Window”→“Lighting”面板,在Skybox选项中选择新建的天空盒材质球,如图2-47所示。

图2-47 指定天空盒材质球
- 针对相机的天空盒
步骤01 在Hierarchy面板中选中需要添加天空盒的相机,在Inspector面板中将“Camera”组件的“Clear Flags”选项选为“Skybox”,如图2-48所示。
步骤02 单击Inspector面板中最下方的“Add Component”(添加组件)按钮,选择“Rendering”→“Skybox”选项,如图2-49所示。也可以直接在文本框中输入“Skybox”。

图2-48 设置相机的清除标识

图2-49 添加Skybox组件
步骤03 将天空盒材质球赋给“Skybox”组件中的“Custom Skybox”选项,如图2-50所示。

图2-50 设置Skybox组件