Unity 动态编辑Terrain地形(五)贴图

****

完整代码我已经上传到了我的Github上,需要的话可以直接去下载https://github.com/xdedzl/RunTimeTerrainEditor,里面有一个TerrainModilfyDemo的场景,我做了一个简单的UI用来测试,工程版本目前使用的是2019.2,但2018.3之后的版本应该都没问题,但Unity貌似不支持从2019回滚到2018,需要新建工程后将资源复制过去。注意编译环境需要是.net4.x,用3.5会报错。

高度编辑请参考 https://blog.csdn.net/xdedzl/article/details/85268674

自定义笔刷参考 https://blog.csdn.net/xdedzl/article/details/85546694

植被编辑参考    https://blog.csdn.net/xdedzl/article/details/85850159

****


1.Unity2018关于地形贴图的更新

       在Unity2018之前的版本中,地形贴图的修改有一个重要的类叫做SplatPrototype,这个类是用来管理贴图信息的,但是,它在2018中被抛弃了,取而代之的是TerrainLayer。下图为两个类的一些属性Unity 动态编辑Terrain地形(五)贴图_第1张图片

       TerrainLayer的加入改变了地形贴图的工作流程,原来需要为每个地形添加贴图层,现在可以直接在目录中创建TerrainLayer,每个地形只需要按需附加TerrainLayer。

       对于贴图的动态编辑来说,TerrainLayer的出现也让地形贴图层的初始化变得更加方便,之前需要加载不同的贴图并创建SplatPrototype,现在可以直接在编辑器中创建TerrainLayer,在代码里直接加载TerrainLayer就可以了。

 Unity 动态编辑Terrain地形(五)贴图_第2张图片

2.贴图编辑 

和高度编辑类似,地形贴图层的数据TerrainData提供了获取数据和设置数据的方法

float[,,] map = terrain.terrainData.GetAlphamaps(mapIndex.x, mapIndex.y, 1, 1);

terrain.terrainData.SetAlphamaps(mapIndex.x, mapIndex.y, map); 

       这里获取的map数据是一个三维数组 ,第一维和第二维度同高度编辑,代表的是地形贴图网格的索引,第三维代表的是TerrainLayer的索引。我觉得用当前贴图层在当前网格的强度来理解这个值比较恰当,如果对应网格所有贴图层的强度值加起来和为1,那么用比例来描述这个值也很合适。

       对于这个三维数组的值的设置要十分谨慎,小了太暗,大了太亮,建议值得范围设置在0到1且一个网格所有贴图层强度的和为1。

 

        相对高度编辑,贴图的讲的较少,github工程中有简单的示例,就没有向高度图一样做跨地图的处理了,但其实地形的几种数据编辑都大同小异,掌握一种之后其余的也可以照搬了。

        关于地形贴图我还想说点别的,近期的项目中,我们需要在上百公里的地形当中动态生成道路,桥梁,水体,树木等信息,而且由于我们的视角需要俯瞰整个地形,所以也不能将数据进行一块一块切分。一开始,道路水体我们都是在程序运行时绘制的Mesh,但由于数据量太过庞大,导致unity无法支持如此多的网格实体,而且项目更加看重在整体上的表现,不需要特别精细的信息,于是将水体信息以及除高速公路以外的道路信息全部改为贴图,下图是我更改了数据之后的效果。所以如果需求允许,地形贴图也不失为一种优化手段。

 Unity 动态编辑Terrain地形(五)贴图_第3张图片   Unity 动态编辑Terrain地形(五)贴图_第4张图片

后来看到了一篇GDC关于地形技术的文章,感触颇深(对,其实就是我做不出来) ,

在此贴上链接【GDC2017】Terrain Technology and Tools

你可能感兴趣的:(Unity运行时地形编器)