如何用Babylon.js和recast.js打造RTS游戏中的3D单位控制网页实验?

摘要:一、运行效果 1、建立一幅具有地形起伏和不同地貌纹理的地图: 地图中间为凹陷的河道,两角为突出的高地,高地和低地之间以斜坡通道相连。 水下为沙土材质,沙土材质网格贴合地形,河流材质网格则保持水平。 2、在地图上随机放置土黄色小方块表示可控单
一、运行效果 1、建立一幅具有地形起伏和不同地貌纹理的地图: 地图中间为凹陷的河道,两角为突出的高地,高地和低地之间以斜坡通道相连。 水下为沙土材质,沙土材质网格贴合地形,河流材质网格则保持水平。 2、在地图上随机放置土黄色小方块表示可控单位 默认控制为自由相机——鼠标左键拖拽改变视角,上下左右键进行移动;按v键切换为RTS式控制,视角锁定为45度俯视,按wasd键水平移动相机,鼠标滚轮调整相机缩放。 3、左键拖拽鼠标产生选框: 松开鼠标后,被选中的单位显示为白色 4、右键单击地图,选中单位开始向目标地点寻路 白色虚线为单位的预计路径,可以看到单位贴合地面运动,经由坡道跨越河流,而非直线飞跃。(在长距离导航时发现部分单位的预计路径没有显示,因时间有限尚未仔细调试) 可以先后为多组单位指定不同的目的地,单位在相遇时会自动绕开对方继续前进 5、鼠标左键单击也可以选中单位 以上代码可从https://github.com/ljzc002/ControlRTS 下载,项目使用传统html引用css、js形式构建,建议读者具有Babylon.js基础知识以及少许ES6知识。 项目结构如下: 二、实现地图编辑 createmap2.html是地图编辑程序的入口文件,推荐阅读https://www.cnblogs.com/ljzc002/p/11105496.html了解在WebGL中建立地形的一些方法,本项目用到了其中的一些思路,这里只介绍不同的地方,重复的部分则不再赘述。地图编辑与RTS控制没有直接关系,对地图编辑不感兴趣的读者可以直接跳到下一章节。 1、入口html中生成地形的代码: 1 var ground1=new FrameGround();//定义在FrameGround2.js中的“地面类”,负责管理地面的纹理坐标和顶点位置 2 var obj_p={ 3 name:"ground1", 4 segs_x:segs_x, 5 segs_z:segs_z, 6 size_per_x:size_per_x, 7 size_per_z:size_per_z, 8 mat:"mat_grass", 9 }; 10 ground1.init(obj_p); 11 //ground1.TransVertexGradientlyByDistance(new BABYLON.Vector3(0,0,-50),30,[[0,14,15],[15,4,5],[30,0,1]]); 12 obj_ground["ground1"]=ground1; 13 14 cri();//这是写在command.js文件中的一些全局方法的简写,比如“cri”是全局方法command.RefreshisInArea的简写, //用来在程序运行时引入额外的代码,这里默认引入的是additionalscript.js,其中包含判断范围的代码。
阅读全文