创建和编辑地形

通过菜单中的GameObject->3D Object ->Terrain,你可以为你的场景创建一个地形对象(这也将在项目视图中增加一个对应的地形资源)。然而,初始的地表除了一个巨大而单调的平面,什么都没有。但如果当地形对象被选中时你查看检视器,你将看到Unity提供了一些工具,你可以用来创建任何你喜欢的地表元素。

unity引擎 教程 unity引擎教学_unity3d


除了树木放置工具和设定面板,在工具栏的所有工具提供了“刷子”的集合,以及对刷子尺寸与透明度的设置。这些绘制工具类似于图像编辑并非巧合,因为地形中的细节正是通过这种方式精确地创建, 通过在地表上“绘制”细节。如果你选择工具栏上最左边的工具(Raise/Lower Terrain)并在场景视图中于地形上移动鼠标,你将在地形表面上看到一个类似于点光源的光标。当你点击鼠标,你可以于鼠标位置处,绘制地表在高度上逐渐的变化。通过在数字工具栏中选择不同选项,你可以绘制不同的形状。刷子的尺寸和透明度选项分别改变刷子的面积,以及它效果的强度。

所有工具的细节将在随后的板块中给出。然而,它们都基于绘制细节的概念,并且除了树木放置工具,都有对刷子相同的选项,即尺寸和透明度。工具可以被用来设置地形的高度,也可以增加染色,平面和其它对象。

地形的快捷键

你可以在地形检视器中使用以下键盘快捷键:
按shift+从Q到Y的某一按键,来选择对应的地形工具(例如,Shift-Q选择了Raise/Lower工具)。
逗号(,)和句点(.)循环选择可用的刷子。
小于号(<)和大于号(>)循环选择可用的树木对象,纹理和细节。
另外,标准的F按键,对地形有轻微的不同。通常,当鼠标在场景视图中时,它将围绕整个对象适配选中状态。然而,由于地形通常很大,按F会将场景视图聚焦到地形中鼠标/刷子当前处理的区域。这提供了非常快和直管的方式来跳转到你希望编辑的区域。如果你按F当鼠标不在地形对象上,将回应标准的适配行为。

高度工具

在地形检视器工具栏上,前三个工具被用来绘制地形在高度上的变化。

unity引擎 教程 unity引擎教学_着色器_02


从左边开始,第一个按钮激活Raise/Lower Height 工具。当你使用这个工具时,高度将随着你用鼠标在地形上扫过而升高。如果你在一处固定鼠标,高度将逐渐增加,这类似于在图像编辑器中的喷雾器工具。如果你按下shift键,高度将会降低。不同的刷子可以被用来创建不同的效果。例如你可以创建丘陵地形,通过soft-edged刷子进行抬升,然后削减陡峭的山峰和山谷通过使用hard-edged刷子进行降低。

unity引擎 教程 unity引擎教学_工具栏_03


左起第二个工具,是Paint Height,类似于Raise/Lower工具,除了它有额外的属性来设置目标高度。当你在对象上绘制时,此高度的上方区域会下降、下方的区域会上升。你可以使用高度属性来手动设置高度,或者你可以使用在地形上shift+点击来取样鼠标位置的高度(相当类似于图片编辑器中的“eyedropper”工具)。在高度属性旁边是一个Flatten按钮,它简单地拉平整个地形到选定的高度。这对设置一个凸起的地面水平线很有用,如果你希望地表包含在水平线上的山峰和水平线下的山谷。Paint Height对于在场景中创建高原以及添加人工元素如道路、平台和台阶,都很方便。

unity引擎 教程 unity引擎教学_地形_04


左边第三个工具,Smooth Height 并不会明显地抬升或降低地形高度,但平均化附近的区域。这缓和了地表,降低了陡峭变化的出现,类似于图片处理中的模糊工具(blur tool)。你可以使用这个,例如,当你已经在可用集合中使用一个噪声更大的刷子绘制了细节。这些刷子图案将倾向于在地表上造成尖锐、粗糙的岩石,但可以通过使用Smooth Height来缓和。

用高度图工作

如之前提到的,高度工具令人联想到图片编辑器中的绘制工具。实际上,地形是使用一个在场景背后的纹理而实现的,那么这些工具实际上像纹理绘制工具那样起作用。
地形上每个点的高度,被表示为一个矩阵列中的值。这个数组可以用一个被称为高度图(heightmap)的灰度图来表示。使用外部编辑器的高度图有时候很有用,例如Photoshop,或者在你的游戏中获取现有的地理高度图。Unity提供了为地形导入、导出高度图的选项;如果你点击Settings tool(工具栏最右边的按钮),你讲找到标记为Import RAW和Export RAW的按钮。这些允许高度图从标准RAW格式中被读取或者写入;标准RAW格式是16位灰度格式,兼容大部分图片和地表编辑器。

纹理

你可以添加纹理图片到地形的表面上,来创造着色和良好的细节。由于地形是如此巨大的对象,在实践中标准的做法是使用一个无空隙地重复的纹理,在表面上用它成片地覆盖(从接近地面的角色视角来看,这样的重复通常不是明显易见的)。一个纹理将作为在地表上的“背景”图片,但你也可以绘制不同的纹理区域来模拟不同的地面,如草地、沙漠和雪地。绘制出的纹理可以在不同的透明度下使用,这样你可以在乡野草地和沙滩之间有一个渐变。

unity引擎 教程 unity引擎教学_地形_05

启用纹理

工具栏中的paintbrush按钮启用纹理绘制。

unity引擎 教程 unity引擎教学_地形_06


一开始,地形将没有纹理分配用于绘制。如果你点击Edit Textures按钮并且在菜单中选择Add Texture,你讲看到一个窗口,在其中你可以设置一个纹理和它的属性。

取决于你在Terrain Settings中设置的材质类型,主纹理图的颜色通道可能有不同的用处。

unity引擎 教程 unity引擎教学_地形_07


标准:RGB通道是地形表面的反射颜色,而alpha通道控制平滑。也有一个“Metallic”滑块,控制表面的所有金属成色。

unity引擎 教程 unity引擎教学_unity3d_08


Diffuse:RGB通道是散射颜色。Alpha通道不被使用。

unity引擎 教程 unity引擎教学_unity引擎 教程_09


Specular: RGB 通道是漫射颜色。Alpha通道为光泽。

unity引擎 教程 unity引擎教学_unity引擎 教程_10


Custom:纹理图如何使用,取决于你的自定义着色器,但通常你希望RGB通道为基色。

除了主纹理贴图,你也可以为所有3个内建的材质类型指定一个法线纹理。这里被使用的法线纹理的纹理类型必须为“法线贴图”(你可以在一个纹理资源的导入选项中,改变纹理类型)。掌控法线贴图的着色器代码将被开启,仅当为地形设置了至少一个法线纹理,所以如果你不使用它们,你不需要付出性能消耗。

Size属性(就在texture boxes下方)允许你设置宽度和高度,即图片将于地形的表面上伸缩的程度。Offset属性决定,平铺纹理开始的位置与地形锚点之间的距离;你可以将它设置为0,让平铺从角落开始。一旦你将纹理和属性设置完成,点击Add按钮让纹理对地形可用。

为了改变一个已经添加了的地形纹理,选择它的thumbnail,点击“Edit Textures”按钮并从菜单中选择“Edit Texutre”。或者,你可以简单地双击它的thumbnail。为了移除一个地形纹理,选择它的thumbnail,点击“Edit Textures”按钮并从菜单中选择“Remove Texture”。

纹理绘制

你添加的第一个纹理将被作为“背景”使用而覆盖地形。然而,你可以添加你希望数量的纹理;随后的这些纹理将可以绘制,通过使用类似的刷子工具。在地形检视器纹理的下方,你可以看到通常的刷子尺寸及透明度选项,但也有另外一个称为目标强度(Target Strength)的选项。这个设置了刷子将会达到的最大透明度值,即使它重复地通过了相同的点。这对于在一个单一地形类型中,添加细微修补的颜色变动,来破坏一个巨大、平整、用相同纹理不断重复覆盖区域的单调,是个有用的办法。

unity引擎 教程 unity引擎教学_unity3d_11

树木

Unity地形可以用树木布置。可以像高度图和纹理被使用那样,树木补丁被绘制到地形上,但树木是固定的、从表面生长出的三维对象。Unity使用了优化(例如,对远距离树木的公告板化)来维持好的渲染效果,所以你可以拥有上千棵树组成的密集森林,同时保持在可接受的帧率。

unity引擎 教程 unity引擎教学_工具栏_12

启用树木

在工具栏上的tree按钮启用树木绘制。

unity引擎 教程 unity引擎教学_着色器_13


一开始,地形将没有可用的树木,但如果你点击Edit Trees按钮并且选择Add Tree,将弹出一个窗口来让你从自己的项目中选择一个树木资源。

unity引擎 教程 unity引擎教学_unity3d_14


在标准资源包中,Unity带有几个样例SpeedTree树木对象,用作蓝本(Assets->Import Package ->Terrain Assets);但也可以用SpeedTree Modeler应用,UnityTree Creator工具或者其他3D建模应用,来创建合适的对象。

如果选中的树木对象是用Tree Creator所创建的,窗口将显示摇摆特性,用于调整对风的响应度。这些请看下面的“让树在风中摇摆”部分。

绘制树木

当一棵树被选中,你可以在地表上用绘制纹理或高度图的相同方式来绘制。可以用按住shift键来从区域中移除树木,而通过按下ctrl,只绘制、移除当前选中的树木。类似的刷子尺寸选项对树木绘制有效,但透明度选项被树木密度(Tree Density)所替代,这控制了在区域的一个给定单元中,绘制树木的平均数量。
一个范围滑块让你控制树木的最小高度和最大高度。如果你停用随机(Random),你可以为所有树木的高度指定一个值。默认下,一棵树的宽被锁定关联到其高度,这样树木通常被一致地缩放。然而你可以停用“锁定宽度到高度”(Lock Width to Height)选项并分别指定其宽度。
同样也有对颜色变化和随机树木旋转的控制。变动选项帮助创建随机、看起来自然的森林,而非由完全相同树木组成的人工种植园。
Mass Place Trees 按钮对创建一个用树木进行完全的覆盖而不在全部地表上绘制,是非常有用的办法。在一个大量安置之后,你仍可以使用绘制来增加或移除树木,来创建更密集或更稀疏的区域。

SpeedTree/LOD Trees

从Unity5开始,你可以使用来自IDV的SpeedTree建模来创建带有高端视觉效果如平滑LOD过渡、快速公告板以及自然风动画的树木。请到他们的页面获取更为细节的信息。你也可以从资源商店包或其他第三方来源免费导入SpeedTree资源到你的项目文件夹中。
查看这里来获取更多信息。

Tree Creator树木

Unity有它自己的树木创建器,你可以用它来产生新的树木资源;但你也可以用标准的3D建模应用来完成此项任务。树木网格必须少于2000个三角面(出于性能考虑),锚点必须在树木从地面上长出的根基处。网格应当有两个材质,一个用于树干,另一个用于树叶。
树木必须使用自然/柔和咬合树叶(Nature/Soft Occlusion Leaves)和自然/柔和咬合树皮(Nature/Soft Occlusion Bark)着色器。为了使用这些着色器,你也不得不将树放在特定的包含了名称“Ambient-Occlusion”的文件夹中。当你在这样一个文件夹中放了个模型并再次导入它,Unity将在一种特别为树木设计的方式中计算软环境咬合。“自然/柔和咬合”着色器依赖文件夹命名习惯;如果你不遵守,树木将不会正确地渲染。
当你从建模应用中保存一个树木资源,你需要点击Refresh按钮(当树木绘制工具被选中时在检视器中显示),目的是查看你地形上更新了的树木。

在树木上使用碰撞器

你可以为一个新的树木资源添加一个胶囊碰撞器,通过在场景中实例化它、添加碰撞器(菜单:Component->Physics->Capsule Collider)、为修改后的树木对象创建一个新的预物体。当你添加树木到地形中,确保你选择了带有碰撞器的预物体而不是原始的那个。你也应当在地形的Terrain Collider组件检视器中启用Create Tree Colliders。

让树木在风中摇摆

需要做的第一件事是创建一个有风区域。你可以通过从菜单:Game Object->Create General->WindZone来进行。
这里,你需要确保你的树被设置为摇摆的。选择你的树,然后选择Edit Trees->Edit Tree。设置摇摆值为1将导致树进行调整,如果你尚未做这件事。
你可能注意到了,你的树木相当狂暴地动着。为了修正,你可以改变你的摇摆值,但直接在“风区”中设置这些值或许会更简单,而保持你的树的摇摆值设置为1。为了避免树木摇动太大,降低风湍流至0.1到0.3,所有东西将明显低更平缓。如果你不希望所有树都飘向同一个方向,降低Wind Main 值与湍流相同的值。

草地和其它细节

一个地形可以有草丛,和其它小物体,比如覆盖表面的石头。草地使用2D图像进行渲染来表现单个草丛,而其它细节从标准网格中生成。

unity引擎 教程 unity引擎教学_着色器_15

启用细节

在工具栏上的细节按钮启用了草地/细节绘制。

unity引擎 教程 unity引擎教学_unity3d_16


一开始,地形没有草地或细节可用,但如果你点击在检视器中的Edit Details按钮,在出现的菜单中将看到Add Grass Texture和Add Detail Mesh选项。出现的窗口将让你选择你希望添加到地形中绘制的资源。

对于草地,窗口是这样的:

unity引擎 教程 unity引擎教学_着色器_17


Detail Texture是表现草地的纹理。一些合适的纹理包含在了Unity的标准资源库中,可以从资源商店里下载。你可也可以自己创建它们。纹理就是一个小图片,其空白区域的alpha通道设置为0(当然“草地”是个专业术语,你可以使用图片来表现花朵,灌木丛,甚至一些像铁丝网之类的人造物体。

Min Width, Min Height, Max Width and Max Height值指定了生成草地的尺寸上下限。为了看着真实,草地用随机“带噪声”模式生成,草地上散落光秃的部位。

Noise Spread值控制替换块的近似尺寸,更大的值导致在给定区域中更大的变化。(技术说明:噪声实际上使用柏林噪声Perlin Noise所生成;噪声的传播取决于作用在地形上x,y位置之间的缩放,以及噪声图像。)在中心的草地替换块,被认为是比在边缘上的更“健康”;Healthy/Dry Color设置用它们的颜色展示草地的健康程度。

最后,当公告板选项被启用,草地图像会被旋转,这样它们永远面向镜头。当你想要展示草地的密集区域时这个选项有用,因为二维图像不可能从哪个方向都能看到。然而,稀疏的草地,单个草丛的旋转变得明显,产生奇怪的效果。

对细节网格,如石头,选项窗口是这样的:

unity引擎 教程 unity引擎教学_unity引擎 教程_18


Detail属性用来从你的项目中选择一个预物体来设置,它将用随机的Width和Height值缩放出单个实例。Noise Spread和Healthy/Dry Color值如它们对草地影响那样进行工作(尽管当应用到如石头的物体上时,“健康”的概念扩展了)。渲染模式可以被设置为草地Grass或者Vertex Lit。在草地模式中,场景中的细节物体实例将被抹平为2D图像,像草地纹理那样表现。在Vertex Lit模式中,细节将被如场景中的固定,定点光照物体那样渲染。

风区

你可以通过添加一个或多个带有风区组件的对象,在你的地形上创建风的效果。带有风区的树木将以逼真的动画效果摆动,而风自身将间歇性生成,来产生树木自然摆动的效果。

使用风区

风区对象可以直接创建(菜单:GameObject->3D Object->Wind Zone)或者你可以向场景中已经存在的任何合适物体添加这个组件(菜单:Component->Miscellaneous->Wind Zone)。风区检视器有一些选项来控制它的行为。

unity引擎 教程 unity引擎教学_unity引擎 教程_19


Mode可以被设置为定向(Directional)或球形(Spherical)。在定向模式中,风会同时影响整个地形;而一个球形风从一个用Radius属性定义的球体中向外吹。定向风在创造树木自然运动时更有用,而球形风更适合如爆炸这样的特定效果。

Main属性决定风的整体强度,但这可以使用Turbulence进行一些随机的变化。如前文提到的,风间歇地吹在树上产生更为自然的效果。间歇的强度和时间间隔用Pulse Magnitude和Wind Frequency属性来控制。

粒子系统

风的主要用途是让树木运动,但它也可以影响到被使用外力模块的粒子系统产生的粒子。更深入的细节内容参考粒子系统。