如何在Unity中开发一个类FEZ的游戏(三)
By Greg Matsura
(译者 @Kohlrabic )
原文地址:
http://gregandaduck.blogspot.com/2014/12/how-to-make-game-like-fez-in-unity-part_14.html#more
前一篇:

★前言

在教程的最后一个章节中,我们将会完成我们的类FEZ游戏的搭建。现在我们已经完成了基本的关卡和角色部分。今天我们将会完成控制3D旋转功能的实现。
FEZ的旋转切换效果是通过从不同的方向来观察我们的关卡来实现的。旋转将会以90°来依次来观察我们的关卡,即前、后、左、右。
在3D场景下,我们有宽度、高度和深度需要考虑。当游戏进行时,我们的3D场景将会被分解为4个2D场景供玩家游玩。本质上场景的深度被忽略了,在屏幕上显示的平面仅保留了X和Y轴坐标。因为忽略了另一个作为深度的坐标,当玩家起跳或旋转时,将会有可能错过平台而落下。这取决于构成平台的砖块的深度坐标的不同,看起来在同一个平面上的砖块实际上来自不同的深度。所以尽管看起来玩家可以走跳到一个平台上,在实际3D场景中这个位置是没有可以立足的方块的,最终还是会错过这个平台而坠落。为了防止这种情况的发生,我们将会创建隐形的立方体invisicubes作为玩家的落脚点。这将会使玩家看起来好像真的在对应的平台上面行动。

★旋转功能基本原理
我们需要完成的脚本基本功能如下:
当玩家没有起跳的时候,检查我们是否在一个隐形的平台之上,如果是的话,将玩家移动到距离最近的实体平台之上。这里我们将判断距离的基准设为距离摄像机的距离。当我们改变了玩家的深度属性的时候,需要更新隐形立方体的位置与之对应。
提示:如果我们允许玩家站在隐形平台上进行旋转操作,这将会不利于我们的管理,并且会出现更多的麻烦。这就是为什么我们需要将玩家移动到正确的实体平台的原因。
★实现旋转功能
在FEZ中,核心玩法是通过旋转来探索世界,解决不同的谜题。通过正交摄像机我们每次只能看到3D世界的一个平面。这意味着去除了景深,所有的物体在屏幕上的显示仿佛都在一个平面之上。我们只会在旋转操作时感受到这是一个3D的场景,剩下的时间中感觉就像是在游玩一个2D游戏一样。
我们从制作一个隐形的立方体开始。我们将会大量地复用它。首先,在你的场景里创建一个新的立方体,将它取名为Invisicube。现在我们要做的就是去除(或者关闭)立方体的MeshRenderer组件,将这个立方体拖拽到Assets窗口创建为预制体。

提示:位置并不重要,但是Box Collider是必须的。去除(或者关闭)立方体的Mesh Renderer组件。
现在我们将会创建一个新的脚本来实现功能。这个脚本有一些长,但是我会对要点做出解释。创建一个新的脚本命名为FEZManager。
代码如下:
当我们开始游戏,这个脚本将会通过player的位置来决定在哪一个深度用隐形的立方体来创建平台。我们在脚本的末尾添加了关于player朝向的枚举。我们通过这种方式来追踪player实时的朝向。当player的朝向在X轴时,决定深度就是Z轴;当player的朝向在Z轴时,决定深度的就是X轴。每当玩家按下键盘方向键的右或者左箭头时,我们将会向着相应的方向旋转player 90°。因为我们的摄像机是player的子物体,它也会自动地跟着旋转,我们的player将会始终面对摄像机,这非常的便利。
在下面对控制器脚本做出更新,我们将会从判断Player是否起跳的功能开始,这将成为我们判定当前是否能够安全地改变Player的深度。如果我们站在一个隐形的平台上面,我们能够知道玩家至少有两个方向的坐标是和构成实际平台的某一个方块相同的。例如,如果Player面朝的方向是前方(Z轴),那么在玩家X轴方向上至少会有一个实体方块。Y轴坐标也应该和这个方块一致,但是因为Character Controller的size可能有些许的误差。Z轴坐标是唯一的差异,相对于玩家,它有可能是正,也可能是负。
通读相关的代码将会让我们更加清楚发生了什么。接下来,我们将要给FezMove脚本做出一些改变,为它添加旋转的功能。我们将会实时检测玩家的朝向和移动方向,来决定我们世界的旋转方向。
下面就是修改后的脚本:
要使用这个脚本,首先创建一个空物体,用于挂载这个脚本。如图所示,你需要将相应的Game Object填入脚本的选项中。

★平台和建筑物(Platforms & Buildings)
关卡的具体设计完全取决于你自己,但是,这里有一些关键点你或许需要提前了解一下。或许可以帮助你更加轻松地完成关卡的搭建。


从中心的支柱为基础,围绕着它开始搭建我们的关卡,不要忘记使用我们之前教程中的自动对齐脚本(AutoSnap)来帮助提升你的效率。


以上就是此篇教程的全部内容了,感谢你的阅读!