Demo视频观看
以前不少人对我提出过这样的需求疑问,如何在游戏进行之中改变地形之类。这种需求最多是出现在虚拟现实中,比如一个什么挖掘机挖出一个坑,地形跟着变化之类。其实在游戏里面有时也会出现这样的需求,比如突然掉下一块陨石,地表砸出一个大坑,然后那一个区域变成不能行走之类。
我也来做做这样的效果。顺带一说,估计很多人会问我效率的问题,我这个在小米2S上面测试是随便都能60帧满帧的,其他机器没试过。
使用脚本,生成了一个平的地面,地面的宽高和段数是可以动态输入的。
然后随便用鼠标在地面上面点几下,出现了几个坑:
进入scene视图看看,网格确实发生了变化,而且随着挖出的坑的深度不同,出现了不同的纹理:
我们接着随意的用鼠标在地面上划动,出现了一条条的沟,这是可以更清晰的看到纹理随着深度的变化:
这时候scene视图是这样的:
好,接下来说说制作的原理:
首先,肯定是得写一个shader,分别对应多层的纹理,和一张遮罩的图片(这个方法之前的日志介绍过,也分享过源码)。
然后,使用动态生成mesh的方法(具体方法我以前也说过),通过高度图来生成网格的高度。
这里我的纹理遮罩和高度图是同一张图片,这样挖的深度和纹理的变化就能对应起来了。而由于这张图片必须是可以读写的,所以我这里是使用了New一张texture2D出来的。至于这张遮罩的宽高,可以在脚本设定。
接下来的事情就简单了,就像做一个绘图板一样,使用射线去获取鼠标点击地形的位置,然后改变遮罩图片的颜色,然后,效果就出来了。
我们还可以随意的改变材质里面的贴图的顺序(截图中的图片通道名称是错误的,由于复制代码,都是Second了……),可以很方便的改变地形纹理的外观,比如把第一张和第四张纹理调转
就会出现了上面是山下面是草地的效果了。