欢迎光临散文网 会员登陆 & 注册

如何在Unity中开发一个类FEZ的游戏(一)

2021-11-15 16:17 作者:皮皮关做游戏  | 我要投稿

By Greg Matsura

(译者 @Kohlrabic )

原文地址:

http://gregandaduck.blogspot.com/2014/12/how-to-make-game-like-fez-in-unity-part.html

译者前言:

由于该教程发表时间较早,新版本Unity中有一处不能兼容的地方(当前参照版本2020.3.14f),译者没有做出修改,大家练习时根据引擎提示修改即可解决问题。立方体贴图的详细讲解可以参照马老师之前的教程:


最近我碰巧最近看到了一篇由Renaud Bédard撰写的技术文章, 他曾作为程序员参与了知名独立游戏FEZ的开发。在这篇名为Cubes All The Way Down的文章中, Renaud介绍了他在开发FEZ专属游戏引擎和关卡编辑器时所运用到的一些技巧与方法。随着我阅读的逐步深入,我对于重现这个有趣的3D旋转机制的欲望也逐渐变得强烈起来。

在FEZ中,你将扮演一名叫做Gomez的小男孩,他得到了可以通过旋转来穿越平面次元的fez帽,随后踏上了拯救世界的旅程。

FEZ的旋转机制非常的有趣,但同时也对开发者提出了十分巨大的技术挑战。根据Renaud的描述,为了游戏的顺利开发,他们制作了自己专用的关卡编辑器。游戏中的立方体是由6个独立的平面组合而成,每个面都有自己专属的图片。这样的结构满足了当玩家进行旋转操作时,立方体的每一个面都能够显示出它所独有的贴图,这极大地提高了游戏的视觉效果,给玩家带来了更好的体验。

我们选用Unity 引擎作为开发的起点。在Unity引擎中我们可以使用正交相机(orthographic camera),帮助我们在特定的方向上方便地将3维场景显示为2D效果。

也许一开始大家都不是很清楚如何来完成整个游戏的机制。这篇教程将会分为三小节,我将会带领你了解如何在Unity引擎中搭建一个类似于FEZ的游戏原型,实现基本的功能。

在第一篇教程中,我们将会制作一个立方体,作为我们打造整个关卡的基础。那么让我们开始吧。


★为立方体设置贴图

- - 开启Unity 并创建一个新项目(推荐使用4.6或者以上的版本)。

- - 创建一个立方体,选中立方体,通过右侧的inspector来调整立方体的参数。

- - 将立方体设置在(0,0,0)处 (之后的教程中我们将会编写一个自动对齐的脚本,将我们的立方体自动对齐在整数单元位置上)。

- - 创建一个C# 脚本并将其命名为UVCCube 。


(译者音:下面的UV mApping有一些错误,有两个面的显示会有一点小问题,请大家自行研究修改,作为课后作业)

UVCCube脚本内容:


那么什么是UV(纹理坐标)呢?UV定义了图片上每个点的位置的信息。这些点与3D模型是相互联系的, 以决定表面纹理贴图的位置。 UV就是将图像上每一个点精确对应到模型物体的表面,这是一种在游戏引擎和3D建模软件中通用的显示贴图方法。Unity中的立方体的UV初始被设置为材质会直接覆盖整个立方体。我们的图片会在整个立方体的各个面上被拉伸。

为了模拟FEZ引擎中的体积像素,我们需要在立方体的每个面上正确显示不同的贴图。一般像这样的立方体我们称之为三维像素或者体积像素Voxel,在FEZ圈子中人们习惯将它叫做Trixel,但事实上它们是一样的。上面的脚本会给我们的立方体的每一个面贴上正确的图片,在游戏中所有的立方体上面我们都会使用这个脚本。

接下来我们需要准备应用在我们的立方体上面的图片。我根据freeblood的原则创建了下面的样本。

Freeblood的名字源自它的缩写FRBLUD,分别代表着代表着前(front),右(right),左(left),上(up),和下(down)。这是我们的图片按着立方体六个面应被创建的顺序,按着这个原则配合我们的脚本可以快速地创建出拥有不同贴图的立方体。

保存下面的贴图模板作以供我们的立方体使用,并按照下面的示例图片进行设置。

图片模板(1)
图片设置
将图片应用在立方体上面


在这里我们将UVCube脚本的tile size 设置为0.125 。我们每面的贴图宽度为16像素,上面所给出的贴图模板(1)的宽度为128像素,因此立方体每面所用到的是我们图片宽度的12.5%。我们的脚本会按着该百分比将图片设置在我们的立方体每个面上。如果设置正确,当我们按下Play时,将会看到下面的效果:

★使立方体贴图在游戏运行前能够正确显示

这时可能有的同学会发现,在我们没有运行游戏之前是无法正确显示立方体的贴图的。这是因为只有在游戏运行情况下ApplyTexture() 函数才被调用。接下来我们写一个脚本,添加一个ApplyTexture的按钮,使我们在没有运行游戏之前就可以实现立方体的贴图。这会帮助我们在搭建关卡时更加轻松。

首先建立一个名为Editor的文件夹,用来存放我们的脚本。在这里我们可以改变或者增加Unity编辑器的功能。用这种方法我们就可以随意地拓展Unity编辑器的功能。

在你的Editor脚本里添加如下代码:


通过这个脚本,Unity将会自动将这个脚本添加到所有类型为UVCube的对象下。脚本中的DrawDefaultInpector() 函数会被自动调用,并在UVCube的菜单中创建名为ApplyTexture的按钮。当那个按钮被按下时,就会调用我们立方体上面的ApplyTextureFunction()函数。

这时我们就可以按下立方体上面的 ApplyTextrue 按钮来更新立方体的贴图,直接在编辑器中看到贴图的效果,而不用每次都去运行游戏了。



★让物体自动按网格排列(吸附到网格)

接下来,我们将会在我们的Unity编辑器中添加自动吸附到网格的功能。在Unity编辑器中搭建场景时,立方体的对齐将会消耗大量的工作时间,因此我们需要为编辑器添加自动对齐物体的功能。为了达到这一点,在Editor文件夹中创建一个名为AutoSnap脚本。在脚本中使用如下的代码:

要使用自动对齐的功能,首先选中一个挂载了该脚本的物体,按下ctrl+L(在Win os中),或者CMD+L(在Mac os中)。这时你可以看到弹出的AutoSnap功能的窗口。确保自动对齐功能开启,并且单元长度(unit)设置为1。现在无论你如何在场景中复制这个立方体,立方体都会自动在网格上以单元长度为单位进行对齐。在我们摆放剩下的任何立方体之前首先要想到的就是将这个脚本设置为生效,保证我们始终对齐在网格之上。这样我们就可以更加轻松地搭建我们的世界了。

AutoSnap窗口

提示:如果通过热键你可以看到自动对齐的选项窗口,但是砖块无法自动对齐,这时你需要点击运行游戏一次然后停止它。此时再次按下热键,尝试移动砖块,应该就能够自动对齐了。


前期工作都准备好了,那么是时候搭建我们的场景了。

首先在你的游戏场景中创建两个空物体,手动设置它们的坐标为(0,0,0)。将其中一个命名为Buildings(建筑),另一个命名为Platforms(平台)。将我们的立方体设置为Platforms的子物体,在hierarchy窗口的显示中应该像是这个样子:

提示:你可以按下热键 Ctrl+D或者CMD+D来快速复制物体。

为了进一步完善游戏,在我们的关卡中心加入一个垂直方向的柱子。

为此我创建了一个新的贴图样本供大家使用。使用方法和上面的土地砖块贴图一样。创建一个新的立方体并且把它设为Building Game Object 的子物体(不要忘记给我们的立方体添加 UVCube 脚本)。

贴图样本(2)

按照下面的示例搭建场景:

到此为止我们的前期工作已经全部完成了。在教程的下一章节中我们将会去学习如何创建一个可以移动的2D精灵图角色。恭喜,到目前为止你已经准备好了一个类FEZ的关卡编辑器!






如何在Unity中开发一个类FEZ的游戏(一)的评论 (共 条)

分享到微博请遵守国家法律