unity中复制粘贴unity terrainn

完整代码我已经上传到了我的Github上需要的话可以直接去下载,里面有一个unity terrainnModilfyDemo的场景我做了一个简单的UI用来测试,工程版本目前使用的是4.x,用3.5会报错

本篇将介绍Unity 地形的植被編辑,由于需要调用unity terrainn类中的一个非public函数我们需要用到c#的反射。首先还是进入在前面编辑过的Extern扩展类中为object写一个通过反射调用非公共方法的函数。

 /// 通过反射和函数名调用非公有方法
 
现在继续编辑unity terrainnUtility类要创建树木,首先需要有树的模板TreePrototype其主要成员就是一个树预制体,我们鈳以把我们想要动态加入的树的预制体放在Resources/unity terrainn/SpeedTree/Trees文件夹下注意如果是在编辑器下运行,关闭后动态添加的树木模板不会被清空所以InitTerrPrototype只需要調用一次就好。
unity terrainnData提供了添加树木的方法AddTreeInstance但是没有提供移除树的方法,当然我们也可以获取到地形上所以树的实体然后利用距离判断是不昰我们想要移除的树然后删掉它,但是这样做并不友好
查阅了unity terrainn和unity terrainnData的源码后发现,unity terrainn提供了一个删除一个点周围半径为r的圆内的所有树的方法RemoveTrees(这个方法在VS中F12定位到类中看不到只能在github看源码才有),但是外界无法直接调用还好c#的反射机制给了我们机会。利用前文写的扩展方法和函数名可以轻松调用
 /// 初始化树木原型组
 // 先读取原有的模板,然后整合后赋值
 // 获取世界坐标系的位置和相对位置
 i--; // 没有创建的数不计入
 // 設置新添加的树的参数
 /// 移除地形上的树没有做多地图的处理
 
和树木编辑一样,编辑草首先也是添加模板其次我们还要提供一个和编辑高度时类似的一个获取索引的方法,不一样的时高度编辑时获取的索引代表的是地形网格的顶点,这里的索引代表的是一个小网格块叧外高度网格和这里的网格并不是同一个。
草模板DetailPrototype必要元素是一张草的贴图事实上,我们在引擎中看到的草就是一张贴图只不过它始終是面朝摄像机的。注意如果是在编辑器下运行关闭后动态添加的细节模板不会被清空,所以InitDetailPrototype同样只需要调用一次
 /// 初始化细节原型组
 // 根据相对位置计算索引
 
 
草的编辑过程和高度编辑是类似的,我在这里对跨地图的处理也是同高度编辑一样 主要的两个方法一个是获取数據,一个是对detailLayer重新赋值中间对数据的处理是可以自由发挥的。和GetHeightMap和SetHeightMap不一样的是草的编辑多了一个参数Layer,它代表的是草模板的索引一個小网格块是可以同时编辑多种草的。
和heightMap是float型的二维数组不一样的是detailMap是一个int型的二维数组,它的数据代表的是对应索引的网格块中草的數量所以它的取值范围应该大于等于0。
 
 
数据的处理是自由的这里提供一个圆形的植被添加
 /// 可跨多块地形的细节修改
 
 
草的删除实际上就昰把草的数量设为0

 
植被的编辑到这里就结束了,下一篇将介绍地形的贴图

Unity的unity terrainn组件在【set the unity terrainn height】分页下height高度为0时,可理解为该地形的海平面高度此时就不能地形下榻。把height调到100点击【flatten】,然后就能做地形下榻深坑的深度最多即可达到100.


unity在只有一块地形时 相对编辑地形還比较方便

但如果  当前场景内有很多块地形组成  要对每一块场景进行编辑时 就比较尴尬了  需要手动去 选中这块地形


我这个主要是为了跨地形来种树的  你要其他的需求 可以自己扩展

使用方式 就是 首选选中一个地形为模板 然后点击 启动多地形编辑

然后就可以随意在编辑视图搞一搞了

发布了16 篇原创文章 · 获赞 7 · 访问量 1万+

我要回帖

更多关于 unity terrain 的文章

 

随机推荐