天天看点

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

本节书摘来自华章计算机《unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.10节,作者 [英]艾伦朱科尼(alan zucconi)[美]肯尼斯拉默斯(kenneth lammers),译 占红来,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

很多即时战略游戏需要通过在某个选定单位周围绘制圆环来显示一些距离(比如攻击范围、移动距离、视野范围等)。如果地形是平整的,可能只需要在四边形上画一个圆形纹理就可以了。但是如果地形不是平的,则四边形可能会被一些小山或者其他几何体给截断。这一节中你会学到如何在复杂地形上使用着色器画圆环。如果还想移动这个圆环,就需要一个着色器和一些c#脚本。下图是一个在由一堆小山构成的地形上画出圆环的例子:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

这个技术并不需要对场景中的每一个几何体进行操作,而是针对地形进行操作。因此第一步需要在unity中准备一个地形。

首先创建一个名为radiusshader的着色器和一个名为radius的材质。

准备一个角色,我们会在这个角色周围画出一个圆。

从菜单中选择 gameobject | 3d object | terrain来创建一个新地形。

给地形创建一定的几何结构。可以导入一个已有的结构或者使用工具来创建一个新的(raise/lower terrain, paint height, smooth height)。

在unity中,地形是一类特殊的对象,地形上的纹理映射也和传统的三维模型上的纹理映射有所不同。不能通过着色器提供一个_maintex纹理,因为地形需要自己提供纹理。步骤是选择paint texture,然后单击add texture...。

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

现在纹理已经设置好了,你可以修改地形的材质,通过这个材质就可以应用我们的自定义着色器。从terrain settings中修改material属性为custom,然后将radius材质拖曳到custom material栏。

现在你就可以开始创建着色器了。

首先编辑radiusshader文件。

在新的着色器中添加如下四个属性:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

在cgprogram部分添加相应的变量:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

表面函数的input结构不仅需要纹理的uv值,还需要地形上每个点的位置(在世界坐标下)信息。可以通过修改input结构来获得这个参数:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

最后使用这个表面函数:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

以上这些就是在地形上画圆环所需要的所有步骤。你可以使用材质的inspector标签页来修改圆环的位置、半径和颜色。

如果想要圆环跟着角色走,还需要其他一些必要的步骤:

创建一个新的名为radius的c#脚本。

给该脚本添加如下属性:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

在update()方法中,添加下面几行代码:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

将脚本添加到角色上。

最后将radius材质拖曳到脚本的radius material栏。

现在可以把你的角色到处移动一下,这个脚本始终会在你的角色周围创建一个漂亮的圆环。修改radius脚本的属性也会改变圆环的半径。

绘制圆环需要的元素有圆心、半径和颜色。在着色器中可以通过_center、_radius和_radiuscolor分别得到。我们通过在input结构中添加worldpos变量来请求当前绘制的像素在世界坐标中所处的位置。世界坐标的位置也是物体在编辑器中的真实位置。

surf()函数是真正绘制圆环的地方。它会计算绘制点到圆心的距离,然后判断该距离是否属于_radius到_radius + _radiuswidth范围内,如果在这个范围内,就使用选定的颜色;如果不在这个范围内,就像我们见到过的其他着色器一样直接采样纹理映射的颜色。