方案一:(使用较麻烦,性能最高,推荐方案)
1.可行走区域建模,比如有一个场景,美术可以通过3dmax建模软件,对可行走区域建模,类似于一个平面,有高低起伏,如果美术建模,切记3dmax中和unity中的坐标转换,导入fbx到unity场景中的旋转信息必须为(0,0,0)。或者可以把场景直接放到unity中,unity中有个NavMesh的组件,通过简单脚本也可以直接生成obj,这里不熟悉unity的自行百度,然后放3dmax中转成fbx再导入unity场景中。
2. 生成高度图,先通过unity插件导出场景,这里其实也可以直接放到laya3d场景中,根据可行走区域获取高度数据,这个可参考官网的示例http://layaair.ldc.layabox.com/demo/?D3Base_StaticModel_MeshTerrainSample,这个方法不推荐,因为初始化所有高度数据时间过长,如果真实游戏,体验很差。这里,由于某些需求,我写过一个脚本,但没有发布,原理 是通过射线检测可行走区域网格模型,采集高度数据,绘制生成一张png高度图,每个像素点代表一定区域高度,生成高度图的大小可控,但不要超过2048*2048,高度图越大,越精确,但相应所占的内存和显存较大,酌情选择。脚本见附件, 放到layaair3D中 直接运行即可,运行成功后,会自动下载一个文件,把文件后缀改为png即可。
3.使用高度图
高度图的预加载:
{url: "res/heightMap.png", clas:Texture2D, priority:1, params:[true]}
场景中初始化MeshTerrainSprite3D:
//通过场景中子父级节点寻找可行走区域网格模型
var meshSprite3D:MeshSprite3D = sceneSprite3d.getChildAt(0).getChildAt(0).getChildAt(13) as MeshSprite3D;
var texture:Texture2D = Loader.getRes("res/heightMap.png") as Texture2D;
//通过高度图纹理和最大高度最小高度生成MeshTerrainSprite3D
var terrainSprite:MeshTerrainSprite3D = MeshTerrainSprite3D.createFromMeshAndHeightMap(meshSprite3D.meshFilter.sharedMesh as Mesh, texture, minHeight, maxHeight);
terrainSprite.transform.worldMatrix = meshSprite3D.transform.worldMatrix;
角色行走时获取高度: var mheight:Number = terrainSprite.getHeight(x, z);
//mheight即为当前角色所在位置高度
if (isNaN(mheight))
//非数字,则走到不走区域,做相应的逻辑判断即可
方案二:(使用方便,性能较差,不推荐) layaAir3D在下下个 版本会新增功能--地形,也可支持从unity中导出地形,然后直接就可从地形中获取当前位置 所在高度。因为地形牵扯到移动端浏览器硬件设备的很多技术瓶颈,性能比肯定不如建模软件直接创建的模型,所以此方案酌情考虑!