『遨蓝开发日志1』2D游戏地图分层问题
2018年11月19日

这是一个新系列,用于记录我的独立游戏《遨蓝》的开发过程,之后我会在这里持续更新开发过程中遇到的问题以及解决方式。

一.两个镜头

由于这个游戏是航海探索类游戏,所以不可避免会有人物和船只切换的过程,这个解决比较方便,采用两个GameObject以及两个Camera即可解决。

二.地图分层

地图我采用的是Tiled Map瓦片地图,可以比较方便省力地绘制地图。但是比较麻烦的是这个地图分层问题,由于有两个控制对象,并且他们之间的处理又是互斥的,比如船不能到岸上,人不能到海上。对于这个问题,我想了几个解决方案。

1.地图属性

给每一个地块都赋予特殊的属性,类似于minecraft,检测到不同地块种类,对应不同控制对象,做出不同的反应。比如船+海=行进,人+海=游泳/挣扎,船+沙滩=搁浅不动,人+沙=速度稍稍变慢。但是由于Unity碰撞体的机制,如果要这么做就得每个瓦片都添加collider,感觉不太优雅,不太好优化。并且我没有找到api接口,可以获得这个瓦片的自定义属性,资料很少,这条路卡顿了很久,最后放弃。

注:但是有接口可以获得那个瓦片对应在瓦片地图上的索引坐标,可能如果找到合适的api,配合一个坐标与素材的映射(可以解析.tmx文件),就可以做到。

2.碰撞规则

Unity的Physical setting里可以设置不同layer层级的碰撞规则,我尝试将不同层级分层,但是遇到一个问题,如果要用碰撞器阻拦船只上岸,陆地还是要设置collider,同时为了实现人下海速度慢的效果,海也要设置collider,这样最后还是要给每个瓦片添加collider,而且规则很死,放弃。

3.两个地图

最终我找到的解决方案,很暴力、简单,就是将人和船拆开,并且人对应的地图和船对应的地图也分开,就像在做两个场景,只不过叠在一个地方。

这是测试地图,一开始将这些全部放在一个文件里。

如下两图,现在分成了两个地图文件,上图是陆地,供人物使用,可以发现海洋部分采用land_forbidden层的图块处理,即原来所有的海洋部分。这个图块可以添加collider来达到触发器(游泳)/碰撞器(不能到海里)的效果,可以给buildings层的城堡添加collider达到触发器的效果。

而下图是海洋,供船只使用,可以发现陆地全用sea_forbidden层处理,即船只不需关心岸上有什么东西,反正都不许进入(碰撞器)。

之后就是在Unity里,设置船和海洋地图为Sea层,人和陆地地图为Land层。在Physical setting里设置碰撞规则,Sea层和Land层互相之间不进行碰撞。

这种方法比较简单,当然缺点就是画地图时候比较费心,要分两块存,并且要操心最后合在一起的效果好不好,建议先用一个文件绘制好完整的地图,之后再分层存成两个文件来处理。

--