做个解谜游戏送学妹:尝试复刻《HOCUS》

作者:MCATIN
2021-01-17
8 4 0

如果要实现游戏的效果,需要完成以下任务:

  1. 利用 unity 创建出符合透视错觉的关卡结构
  2. 编写一个寻路系统,让玩家能通过点击在这个关卡内移动。


下面开始实现功能

首先在创建了一个新的工程后,我从 unity 商店里导入了 DoTween 插件,这个插件可以用来简便的实现各种移动的效果。

接下来就要搭建关卡。搭建关卡的时候,我用小方块组合出整个地形。在这里需要把小方块的每个面都标记成路径点,并根据位置给他们命名。然后把他们存成 prefab 方便后面使用

在这可以看到 每一个小方块上面用来标记路径点的位置都有一个小圆球,是因为我在 OnDrawGizmos 方法里添加了对应的内容。

然后把摄像机的投影模式从透视改成正交,并且调整相机的角度。

调整之后,我就开始利用准备好的方块搭建关卡了。这里我按住 Ctrl 键后再去拖拽方块就可以让他以整数倍大小移动,这样更可以方便搭建场景。

搭建完关卡后,我发现画面左下角的方块的遮挡关系不正确,需要左下方的这一截遮盖在最上方。

所以我先新建一个 Layer 把需要放到顶端显示的方块加入到这一层级后,利用一个新的摄像机单独拍摄这些内容。

但我又发现被更改的的方块会突出来,没办法被正确遮挡,所以这里又添加了几块 Plane 并同样设置为用来遮挡的那个层级,用多块 Plane 来遮挡掉露出来的部分,然后将所有方块的阴影去除。

搭建完关卡本身后,再修改一些环境显示的参数,包括天空盒以及地形的材质,还有光源等其它的参数,这样关卡就基本成型。

然后我又新建了一个方块用来代表玩家,调整了一下它的颜色和位置,再复制一个用来代表终点。

然后就是将每一条玩家可以行走的路线都连接起来。

在这要做的就是把每一个路径点与其所在表面上相邻的所有点关联起来,这样当我们在这个点的时候,系统就可以知道它可以移动到哪个点了。

寻路的部分,在获取鼠标点击的位置后,利用获取到的信息,结合之前保存的路径点信息,生成一条可行的路线。

并且由于规划时是通过方块作为单位,但是在同一个方块上,有多个不同的面,所以需要对所有面都尝试进行路线判断,生成多条路线,并选择一条能连通两点且距离最短的路线。

在这中间,我使用了射线来获取玩家现在所在的方块,以及具体的方位,用来减少不必要的计算量。

完成后把脚本绑定在玩家上。运行游戏测试了一下,我发现玩家方块总是会移动到地图内部。这是因为我所标记的路径点全都紧贴了地形表面,当玩家方块移动至此时,自然会移动到错误的位置。所以我把他们又向外移动了半个方块的单位。


接下来就是发现,在方块在普通层级和遮挡层级的方块间移动时,由于本身层级没有跟随着变化,所以发生了视觉关系的错位。所以为了修正渲染上产生的问题,我又额外的增加了一些设置,用来在游戏运行的时候动态的改变显示内容的层级。

最后把场景中所有需要改变层级的地方设置好,这样就完美的完成这个关卡了。

这就是我还原游戏 Hocus 的过程,以下就是游戏完成后的效果。

虽然这个关卡还不算非常复杂,但我相信即便是更复杂的关卡,通过类似的方式也可以搭建出来,欢迎对此进行更多的交流。顺便附上我的工程代码,有兴趣了解更多细节的同学可以看一看。

工程文件地址

如果这个视频对你开发有所帮助,别忘了 B 站给个三连!