地图编辑器的功能
- 规划和构建可行走区域和障碍区域。生成导航网格。可以使用不同颜色的多边形展示不同的区域。
- 地形与物件编辑。
- 游戏逻辑配置 - 关卡,触发器,事件,怪物出生点等业务逻辑的参数配置等。
地形编辑
定制式地形
直接制作模型
。直接把网格作为地形放置在场景中,再给网格加上MeshCollider(一般再加个简模)作为碰撞。使用地形系统
。[[Unity-Terrain]] 内置的地形系统可以使用高度图存储。
程序拼接
- 2D地图分成一个一个格子,程序动态 生成,只需要一个网格+设置UV,就可以在一个Drawcall中绘制整个地图。
- 暗黑破坏神的地图拼接。
- 程序拼接的地形需要合并模型,合批Drawcall,提高性能。
物件编辑
- 物件以预制体的形式存在,以坐标、旋转角度、缩放大小为基准形成数据。
- 可以按以下代码存储地图中物件的数据:
1
2
3
4
5
6
7
8
9
10
struct map_unit
{
position, // 坐标
rotation, // 旋转角度
scale, // 缩放
type, // 类型
table_id, // 配置表ID
size, // 大小
function_type, // 功能
}
地图加载方式
- 地图编辑器的主要作用是对场景地图进行编辑,且它有一个地图数据文件可供前后端使用。可视化体验良好的地图编辑器能够更好地帮助场景设计师、关卡设计师编辑更好、更绚丽、更好玩的地图场景。有了地图数据,才能更有序地在游戏中实例化地图场景,在加载地图时也才有更明确的目标。
- 从地图数据到场景还原都是通过
加载资源实例化
的方式进行的。
直接加载整个场景
- 最简单,只需要根据地图数据文件把所有数据反序列化到内存,针对每个元素,加载它们所指定的模型或效果资源,并实例化到指定位置,设置旋转和缩放,或进行其他的一些操作。
- 如果场景简单,使用一次性加载,甚至可能不需要地图编辑器,只需要一个 prefab就能搞定整个场景。
按需异步加载场景
- 如果场景很大,内容很多,全部加载到内存就会浪费掉大量内存和CPU,制作一个编辑器能帮助我们拆分地图中的元素,按需加载物件,节省不必要的内存和CPU开销。
- 按需加载,边玩边加载不会阻塞游戏很长时间,异步加载缓解了CPU在某个瞬间的消耗,体验会更好。
大地图无缝加载
- 把世界按照格子划分,以角色为中心加载周围8个块的内容,角色移动时,加载玩家周围新的格子,卸载离开的格子。
- 九宫格之外的场景用迷雾,面片背景等遮挡住。
- 加载时同步和异步相结合使用,关键部分如地形,碰撞,主要模型等使用阻塞加载让玩家能立刻看到;其他物件使用异步加载并由近及远的顺序加载,使体验更加平滑。