异星虫生——地图系统

11/0642 浏览综合
介绍下我们游戏地图系统的开发,我们虽然用的是Unity引擎,但在做这套系统时其实参考了一些UE的概念。
我们的地图和星露谷物语类似,是由几个小的关卡拼成的一个大地图
玩家可以在关卡之内走动,当走到关卡与关卡之间的连接点时,就传送到下一个关卡。
为了实现这个需求,实现了一个简易的地图管理系统(p1~2):
最上层是MapManager,它负责管理地图的所有关卡,以及部分动态物件(npc,交互物,床等等),关卡之间的传送
中间层是关卡(Level),关卡需要管理下面动态物件的生成,灯光的切换等(p4)
关卡与关卡之间通过连接件(LevelConnector)连接,连接件主要由三部分构成:Owner(属于哪个关卡),NextLevelConnector(传送的目标连接器),Collider(决定了传送的范围)
最底层就是前面提到的,地图的各种物件,分为静态物件和动态物件,动态物件主要包括:
各种Npc,各类可交互组件,以及一些特殊的Actor,他们都继承自同一个基类ActorBase
p.s.
1.为什么不每个关卡用一个Scene?因为我们的关卡内容不多,都放到一个Scene里也不会内存爆炸,Scene不够轻量化,在关卡与关卡之间频繁切换时不会那么丝滑,且配置起来并不直观,所以这里借鉴了UE的地图设计,将Scene当成WorldMap,下面的关卡则是各个levelinstance,共同组成完整的游戏地图。
理论上来说,这个结构做大世界无缝切换也是可行的,只需要流式加载Level即可,这时Level就相当于UE世界分区里的Streaming Cell了,如果想要按网格分块加载,则需要将Level进一步拆分成一个一个格子
2.我们的地图本来更加复杂(p3),但是因为产能问题最终只留下了四个,有点遗憾但内容量也够了
3.玩家出生点也是一个LevelConnector,所以LevelDesigner可以很方便的调整玩家出生的位置,总之,所有跟传送相关的业务都可以通过这个组件完成
TapTap
TapTap
TapTap
TapTap
6