在我还只是一个玩家的时候,当年的神作“时空幻境”里针对时间的玩法就给我了我很大的震撼。现在,入坑游戏制作的我,也想试试看复原出当年最让我震撼的那个点。
这个是我实现出的利用时间回溯去完成的游戏。除了记录过去的时间发生的事情这点与时空幻境相同之外。与它不同的是,在我的这个游戏里,时间回溯的方法更像是平行世界那样,多条时间线同时进行。下面我就来分享下我的实现过程。
新建一个 unity2d 项目,之后把事先准备好的素材都导入进去。在这里我准备了主角的素材、地面和平台的图片以及绳索的插件。
素材的部分,在这里我使用的都是 opengameart.Org 中的免费素材。这里有包括游戏用的图片、音乐音效等大量的免费素材可以使用。对于个人开发尤其是原型级别的作品来说,可以节省大量的时间。
绳索部分我使用的插件是 Ultimate Rope Editor。可以直接在 Asset store 里面找到。
在实现任何功能之前我们需要一个能让玩家自由活动的地方,在这我打算使用 TileMap 搭建一张地图。
从 window 选项中打开 TilePalette,并在 Hierarchy 里创建一个新的 TileMap
。之后将下载好的制作地形用的 TileMap
素材的参数设置好,再在 Sprite Editor 里面设置图片切割的参数,最后导入 TilePalette
。这样就可以随意搭建关卡啦。
但是现在的摄像机视野还有点小,不足以显示场景,所以需要把摄像机的 size
调成 14
。还有不要忘记给创建的地形添加碰撞体积,选定对应的 TileMap
之后,挂载上 TileMap Collider 2D
即可。
接下来就是愉快的搭建关卡的时间,关卡内还需要包含一个出口标志,标记最后的目标位置。
创建完地形后,再创建玩家操控的角色
新建一个 GameObject
后,把主角的素材和碰撞体积、还有刚体统统加上,顺便调整一下主角的朝向。
然后我又自己编写了一个简单的脚本,控制主角的移动等行为。
直接运行游戏,可以看到主角的移动看起来轻飘飘的,而且降落时还会出现不想要的旋转。
所以需要在刚体设置里里把 z
轴的“冻结旋转”勾上,然后在项目设置里把重力调大,这样跳跃效果看起来就合理许多。
关于怎样记录过去时间的问题,最初我的想法是记录小火苗每时每刻的位置,而回溯时直接从最开始依次读取。
但是很快我就发现这样做会出现一个与目前玩法冲突的问题:现在的玩法设计,允许后出现的火苗触发机关后影响以前时间线的火苗,但是一旦采用单纯记录位置的方式,这种情况将会变得十分不好处理。
所以最后我转而选择了记录操作队列后回放的方式。
这里要注意的是混合使用 Update
和 FixedUpdate
时要分清楚哪些数据在 Update
中记录合适,哪些数据在 FixedUpdate
中记录合适。由于记录操作需要相对较高的时间精度,所以对于记录方式应该慎重处理。
还有一个问题,现在在回溯时,两个小火苗会发生碰撞。所以在这,解决方法是把所有小火苗标记为同一 layer
,然后在 project settings
的 2d
物理设置里面取消掉小火苗之间的碰撞。
为了体现游戏的核心玩法,我们还需要制作一个能和玩家交互的地形。
这里的移动平台将会由四部分组成:
可以被火苗触发的机关底座、机关触发后让火苗无法离开的盖子、会移动的平台、最后就是表示平台和机关连系的绳索
底座的功能是在火苗与其接触的时候发送一条消息,因此这里直接使用 OnCollisionEnter2D
检测碰撞就 ok 了。
盖子则简单很多,身上不需要套代码。套上碰撞盒之后,直接用 unity 自带的 Animation 做一个盖子划动的小动画就可以。
接着在底座的代码里加上和触发动画有关的逻辑。
为了表示机关和平台之间的联系,我们需要用绳索将平台和底座连接起来。
在平台和底座分别新建一个 GameObject
作为绳索的头和尾,并把之前导入的插件中绳索的代码拖到平台里,再调整一下长度数值。
创建完绳子之后,还需要再给绳子创建一个材质,这样绳子就可以正确的显示了。
最后就是如何让平台动起来,这里在代码里用到了 MoveTowards
。
这样我们就可以通过设定不同位置的 waypoint
来让平台向指定方向移动了,根据不同的距离和位置调整一下移动速度和绳子的长度。
除此之外还需要让玩家站在平台上时会跟着平台移动而不是掉下去。
我使用的方法是将站在平台上的玩家设为平台的子物体。这样就能模拟出玩家站在平台上因为摩擦力和惯性被带着移动的感觉了。
最后再加上一些必要的美化,就是实现完了这个时间回溯的小游戏最基础的关卡。
以上就是这个游戏最基础的玩法实现。这个游戏的想法虽然源自时空幻境,但又不尽相同。不知道又有哪款游戏在当年震撼到了屏幕前的你,又有什么游戏让你产生了神奇的想法呢?不妨也交流一下。感谢你的收看,下次再见。
暂无关于此文章的评论。