unity入门(九)-地形系统
经过前面的学习你肯定大概了解如何制作游戏了,unity的基本内容我们都已经使用过,只是由于经验不足你很多时候难以想到某些问题解决方案,或者一些游戏内容的普遍做法,而且对于网络、服务器、内存管理等部分也一窍不通,不用担心,这些内容我们会在进阶部分时候进行学习。下面我们给自己的游戏创建一个游戏场景,你就了解怎么制作简单的单机游戏了。不过注意地形和场景是两回事,地形只包括地面上的山脉、起伏,而河流、房屋、植被等都要通过另外的资产或预制件制作完成。
Unity自带的地形系统Terrain据说十分不方便,尤其在诸多开放世界游戏中需要制作精美的大地图,使用自带的系统肯定不能满足要求,感兴趣可以查看这篇博客,简单来说就是使用平铺的Tile配合贴图完成。
所以我们这里对地形系统的使用主要还是入门为主,毕竟要制作一个风格统一的游戏需要优质的美术,需要的纹理等可以通过Assets Store搜索满足要求的场景配合我们前面一篇博客导入和渲染的模型。
准备工作
导入Terrain Tools
创建一个3D项目,在Packge Manager中找到Registry,搜索Terrain Tools,然后导入;导入完成后还要进一步下载提供的Sample包,提供了很多植被的预制件,地形纹理等素材。
如果搜索不到这个包,可以尝试两种办法:
- Project Settings/Package Manager,勾选Enable Preview Packages;
- 点击下图左上角加号,然后输入com.unity.terrain-tools即可;
导入Fantasy Landscape
在Unity Assets Store中搜索并安装这个包,它提供了一个实例场景,以及多种预制件,方便我们制作地形。
修改URP管线
由于我们之前的角色使用的是URP进行渲染,这里我们也用URP来渲染场景,关于URP的介绍在另一个系列的博客中,这里仅记录如何升级一个项目为URP。
建立3D项目后,在Package Manager/Unity Registry中搜索Universal RP,安装,完成后在最外层文件夹中Create/Rendering/Universal Render Pipeline/Pipeline Asset(Forward Renderer)
完成后会创建两个Assets,将第一个Assets命名为URP,打开Project Settings/Graphics,将第一项设置为这个资产:
这里起始就是将默认的渲染管线替换成了URP,URP是可编程的渲染管线,就可以利用它编写Shader了。
导入后在Environments/Scenes中打开实例场景,你会发现场景中的树都变成粉色了,这是因为原本材质上的Shader不能被URP支持,此时我们需要升级材质:
点击以后发现还是没有完全将材质转化过来,我们只能手动调整,进入Environments/Ambient-Occlusion-Trees/Materials文件夹,全选并修改Shader为Universal Render Pipeline/Simple Lit,这是一个通用的内置Shader,使用它可以正确在渲染管线中渲染我们的材质。
完成后打开Prefabs文件夹,接下来要对这四个树的预制件进行相同操作:
- 打开预制件;
- 修改树干Bark的材质为:
- Surface Type:Opaque,不透明;
- Render Face:Front,只渲染前面;
- Base Map:同名纹理图片;
- 修改树叶Leaves的材质为:
- Surface Type:Opaque,不透明;
- Render Face:Both,两面都渲染;
- Base Map:同名纹理图片;
- Alpha Clipping:勾选后可控制透明度;
修改完成后,重新打开样例场景,这一次正确渲染了场景,我们可以开始学习了。
创建并修改地形
创建
打开Window/Terrain/Terrain Tools,第一栏可以创建基本地形,这里我们选择长宽500,高度为100,然后直接点击下方的Create即可创建。完成后看到层级栏中多出来一个拥有子对象的游戏对象TerrainGroup_0,它的子对象就是我们后续操作的目标。
用Brush改变地形
创建之后我们先做一个起伏的地形,选中新建的子对象,看到有一个Terrain组件用于绘制地形,一个Terrain Collider用于进行碰撞检测,我们进入Terrain组件,选择第二个Paint Terrain,下面提供了非常多的绘制模式,我们介绍两种。
Raise or Lower Terrain
最简单的绘制模式,这个刷子可以帮助我们快速调整地形。
其中Brush Mask选项提供了很多不同的刷子,也就是我们刚才导入的包中提供的素材,不同的刷子绘制不同的效果,选中一个刷子后进入地图,操作快捷键如下:
- 左键,点击增高地形;
- A,按住后移动鼠标调整改变地形的力度;
- S,按住后移动鼠标调整刷子大小;
- D,按住后旋转刷子;
- LShift,按住后点击左键降低高度;
利用这些功能就可以方便地制作地形了。
Sculpt/Noise
这个刷子采用噪声纹理的方式来修改地形,滚轮即可调整噪声大小,然后应用到地形上的方式和上面一样,不过这个就比较自然,刷子区域内会根据噪声来表现起伏。
添加纹理和法线贴图
现在地形制作好了,需要给地形添加纹理,在Terrain中地形的纹理通过不同层来实现绘制,选择Paint Texture选项,创建新的层,选择草地和道路的纹理即可。
先添加草的纹理后,可以看到整个地图都覆盖了草的纹理,之后再添加地面的纹理,就可以使用刷子在草地上覆盖绘制了,现在制作一个简单的道路吧!
绘制后你可能发现道路的质量不高,像素化比较严重,这是因为我们使用的分辨率不够,所以回到Terrain Toolbox,修改Control Texture Resolution,并Apply to All。
添加后可以转到我们使用的这两个纹理上,双击它们使用的Layer,这里还可以添加法线贴图,增强地图的凹凸感。
添加内嵌光照
这里简单介绍下,由于场景中比较暗,一个是Directional Light的强度不够,一个就是缺少内嵌光源,我们打开Window/Rendering/Lighting,选择Environment,点击最下面的Generate Lighting,具体原理在光照部分会详细介绍。
然后选中层级栏中的方向光,调整光线强度。
设置树
现在我们使用提供的四个预制件树木来丰富我们的场景。现在切换到Terrain组件的第三项,Paint Trees,点击Edit Trees/Add Tree,依次添加我们刚才修改过URP管线的四个树木,然后选中想要的树木,就可以用刷子添加了。
不过这种方法添加太慢了,我们直接使用Mass Place Trees按钮,将一次性随机添加指定数目的Trees到场景中,当然有一些树可能长在我们的道路上,可以按住Shift并点击来擦除不要的树。现在你可以制作完整的场景了。
添加了足够数量的树以后你会发现树的显示有些问题,在远处的树总是会显示一部分,并不会如我们平常见的游戏中那样消失或隐藏,这就需要制作LOD来调整了,Terrain是支持LOD(Level of Detail)的,但是我们这里为了简单使用就不采取这个办法,下面提供两种解决办法。
使用fog来遮挡
打开Lighting/Environment,勾选fog并调整雾气的颜色,以及雾效果的Density,这样可以用fog来遮盖远处的树木,并且耗费的计算量很小,只是效果可能不会特别好。
设置Billboard Start
转到Terrain组件的最后一项Terrain Settings,找到Tree & Detail Objects,修改Billboard Start的值,这个值和LOD有关,可以通过计算距离来渲染对应距离的模型等级,从而得到较好的效果。缺点则是需要消耗很多CPU计算量,不够这里我们可以暂时使用。
添加草、花
和前面添加树类似,我们打开Terrain的第四项,Paint Details,然后Edit Details,这里可以使用纹理来创建草的模型,也可使用制作好的Mesh(也就是预制件或者模型),我们选择后者,然后添加Flower1和Grass1,调整刷子的尺寸、Target Strength等,然后在草地上绘制草花,添加更多细节。
你可能发现有些草由于地形起伏太倾斜了,这时可以使用Terrain Settings/Wind Settings for Grass的Bending属性,通过控制草对风的倾斜程度来改变草原本的倾斜程度。
最后还可以找到预制件Rock1,直接拖进场景即可,这个由于我们不需要太多,所以可以手动,也可使用前面的方式添加。
设置天空盒
最后我们使用一个免费的天空盒素材,Fantasy Sky Box Free,导入后转到Lighting/Environment,修改Sky Box Material即可:
这样我们的场景就制作完成了。
之后通过添加光照、Global Volume可以实现很好的渲染效果,这里我们先不说明了,后面光照部分会主要介绍这些组件。我制作完成的场景如下:
添加了Global Volume之后的效果:
加上我们之前导入的模型,使用不同的Shader得到的效果:
光照渲染这部分还是非常有趣的,不过难度也比较大,值得深入学习。
总结
到这里我们的Unity基础就算是完成了,包括场景切换,擎界面布局,脚本编写,刚体与碰撞,触发器和射线,UGUI,动画系统入门,以及这里介绍的地形系统,一般来说大规模的项目都有自己开发的地形编辑器,按照Terrain的思路可以想想大概是什么样子。而且我们这里的介绍肯定也不是面面俱到的,Terrain系统中的很多参数都可以自己尝试使用下,Unity中鼠标放上去也会给出解释,总之大概知道如何使用即可。
现在已经可以尝试用免费素材制作一个自己的3D游戏场景了。我们后面的博客重点介绍灯光,摄像机,动画系统和IK,还有场景之间的切换,最后总结下Unity的常用组件及其API,这个Unity入门系列就正式完结了,往后的Unity博客主要就是解决方案的分享,另外还有Unity Shader一个系列会加快更新,届时可能会再回过头来用这些基本操作。都完成后可能会更新非Unity的内容,热更、Lua之类的知识。