Alan Hou的个人博客

Godot从入门到精通基础篇 第四章 转换内置对象创建室内场景

本章中使用基础形状和材质创建一个室内场景。还会展示如何在场景中导航。接上一章,我们会利用所学技术修改对象(如移动、缩放、旋转)。读者还会学习如何配置光照和材质。

学完本章后,读者可以:

项目计划

在刚开始创建游戏时,虽然有很多的资产供使用,但我们在能够(或雇佣其他人)完成更精致游戏之前可能只想快速创建一个原型来测试功能。虽然具备3D建模背景,但很多初学者无法利用该技能使用基础形状快速创建一个关卡。本章会协助读者完成这类任务:使用相对简单的形状创建一个可用的关卡。第一关我们会创建具备如下功能的场景:

创建这一环境,我们要经历如下流程:

不借助预定义地图,很难知道在哪里添加组成场景的各个对象。当然读者可以根据预定义的坐标来放置对象。但是地图在视觉上可以帮助我们更容易地将对象放到对的位置上。本例中,我们会在地面上铺上地图,然后根据迷宫的轮廓在地面上添加对象,最后在添加完所有对象后使用地砖替换掉这个轮廓。

本关的布局如下图所示。基本上是由一系统过道组成。

可以看到,这一个使用Photoshop创作的非常简单的黑白图。由表示空白空间的白色背景和表示墙壁的不同大小黑色矩形组成。也可以使用其它软件如Paint或Gimp在轻松创作想要的地图。使用地图是为了简化在Godot中大概确定迷宫中各部分的位置。这样我们可以按照初始布局绘制,而不用去猜在哪里添加对象。本章中所用的这张图是使用Photoshop创建的。大小为100×100像素,如果你使用Photoshop的话,还可以启动每5像素的网格线,获取每隔一个像素的分区。

创建场景及导入所需资产

开始设计环境之前是,我们会创建一个新场景,以及一个存储所有资产的文件夹。我们还会导入本关所需的纹理。

首先创建一个场景:

我们可以为该场景创建一个文件夹。虽然不是必须,但这有助于管理项目以及将所有该场景使用的相关资产保存在一个独立文件夹内。

读者应该已经下载到本书的配套资源。本章需要导入的图片有bricks.jpgceiling.jpggameMap.png

使用可进行碰撞的对象

上一章中我们使用内置的箱体来创建台阶;但其中不包含导航,因此也就不需要测试玩家和环境之间的碰撞。但在本章中我们要使用控制器来在环境中导航,并与墙壁和地面产生碰撞,所以需要创建包含碰撞检测的对象。也就是说,我们需要确保玩家走到墙面时会停止。

为此,我们构建场景的方式略有不同,不能直接使用原始图形进行创建,而是要将其结合CollisionShapeStaticBody节点进行使用。

CollisionShape节点用于定义决定节点是否处于碰撞中的形状(包含胶囊、箱体或球体等类型的形状)。StaticBody节点受制于物理规律,包含碰撞,但是为静态。这正是本例中墙体的情况,因为墙体不是运动的对象,设计StaticBody是为了让这类对象的碰撞检测不像遵守物理定律的移动节点那样消耗较多资源。

定义迷宫的轮廓

现在就可以开始创建迷宫了。首先,我们会创建一个用作地面的立方体,这个立方体会关联一个StaticBody节点及一个CollisionShape节点。

读者可能注意到了CollisionShape节点上有一个警告标记:这是由于我们需要为该节点指定一个形状类型。也就是说要为该节点指定碰撞器的形状。

这时我们就有了可进行碰撞的箱体:

注意由于CollisionShapeCSGBox节点是StaticBody节点的子节点,应用于父节点(StaticBody)的转换都会作用于子节点。

创建迷宫

至此创建迷宫地面所需的组件已就绪,下面们来改变其形状和外观。

下面对地面进行纹理,CSGBox子节点负责地面的外观,先聚焦于这个节点上:

然后会看到地面(CSGBox)上已应用了纹理 ,如下图所示。

在检查器栏中,点击Uv1属性,会看到缩放属性为(1, 1, 1),也就是说纹理延各坐标轴仅平铺一次,本关中纹理正是需要这样进行展现。

使用简单变换添加墙体

已定义好定义地面并对其应用了模板,下面该使用立方体创建墙面和其它房间了。因为ground节点已包含了StaticBodyCollisionShap节点,我们通过复制并应用转换将其作为墙面的模板。

下面创建第一个房间:

现在我们对这个立方体执行一系列转换,让其与地面纹理中的一个矩形相吻合:

现在可以通过缩放(R)和移动(W)工具调整尺寸及移动立方体,让其与轮廓(定义地面的地图)中的矩形相匹配。

经过连续操作,就创建了与地面纹理相吻合的第一个房间,如下图所示。

至此我们就延x轴和z轴调整好了第一个房间。但仍需调整其调试。我们希望屋顶为2.5米高。下面在检查器窗口中进行调整:

完成㼚操作后就可以对房间应用纹理了:

将房间的外观调整至满意之后,可以复制该房间,调整大小创建其它房间:

重复这一过程完成整个迷宫。

创建外墙面

创建好各个房间之后,迷宫应该像下图中这样。

读者可能会注意到,不同的房间纹理略有不同。这是因为平铺是根据第一个房间长宽来定的。现在可以不必修改。但如果你希望改进部分房间的外观的话,应该为它们定义具体的材料以让平铺相应的变化(因为平铺关联了材料,对平铺设置的修改会改变或创建新的空间材料)。

此时我们的迷宫就快要完成了,还缺少三个元素:四面外墙、屋顶和一些光照。

那我们来创建外墙。先复制任意一个房间,然后通过调整其大小创建外墙。比如可以像下图中那样:

可以看到,这个过程非常简单,可以重复操作创建其它三面墙:

添加在场景中导航的第一人称控制器

至此我们创建了迷宫的地面、一些房间以及外墙,如果能在迷宫中行走就很棒了。为此,我们要在场景中添加人物控制器,这样可以在迷宫中行走查看玩家看到的外观。执行如下步骤:

在使用该控制器之前,我们仅需重新为移动赋值快捷键:

重复以上步骤添加如下设置:

此时可在场景中按下CTRL +R进行测试,应该可以通过方向键和鼠标进行导航并且不会走到墙里面。

改变地面的纹理(删除图像模板)

至此,本关供浏览的界面差不多了,但地面还没有完成。读者应该知道,现在使用的模块是由用于表示何处摆放房间立方体的黑白区间组成的。既然已经完成了迷宫的布局,就不再需要这一纹理了。我们可以使用更真实的材质来表示地面,比如在上一章中用作地面的瓷砖材质。下面就进行修改:

纹理拖放完成后,就会看地面的颜色发生了改变,使用的是tile.jpg的纹理;便我们还是需要修改纹理在地面上重复的方式(平铺方式),这可通过UV1属性来实现。

进行以上调整后,是时候在场景中玩耍闲逛一下了:

为迷宫添加屋顶

看到环境和预期一致之后就可以先退出调试了。现在本关已可用,但是如前所述,最好有一个屋顶。可通过复制地面、上移再修改相关联的纹理轻松实现。我们会使用和之前相关的技术(使用移动工具及在检查器中更改纹理):

完成以上操作后,只需再对天花板设置纹理即可:

最后,我们通过展开UV1属性修改这个新材料的平铺属性,将其缩放值设置为(20, 20, 20)

再看一下场景视图,会发现天花板的纹理发生了改变,如下图所示。

可以运行场景查看纹理,可能会发现天花板很暗,在下一部分中通过添加光照环境相关节点可以解决。

在迷宫中行进时,可能会发现有些区域会比较亮,改处光照从迷宫外部照入,这表示天花板没有完全盖住迷宫。我们可以稍后调整屋顶的位置解决这一问题。

读者可能会奇怪在环境封闭的情况下是如何看到墙面的。我们稍后会深入探讨,但总的来说场景具有默认属性,其中一些与场景的环境光有关。默认,即使没有为场景添加光照,也会有一些环境光。当然我们可以调整,在下一节中讲解。

为场景添加光照

调整好迷宫后, 我们会开始为其添加光照,创建一些黑暗区和明亮区。在游戏中,这会用于隐藏区域或照亮玩家经过的房间或过道。

在添加光照前,我们还设置场景环境的一些属性,对于默认光照,可以使用一个叫做WorldEnvironment的节点实现。

现在看到的场景应该是全黑色,这是正常的。

添加好WorldEnvironment节点,如们可以修改属性来添加环境光。

可以运行场景(CTRL + R)查看场景的变化。

场景这样没有问题,但将场景设置为倒置,隐藏一些区域,再为一些地方添加光照会更棒。

首先,我们将环境光设为全黑:

接下来我们会添加一些光照。Godot中有很多类型的光照,现在我们只会使用点光源来模拟灯泡或火把的光,从具体某一点照亮四周。

因为天花板是场景中y轴上最高的对象,我们可以临时禁用它来更方便地在迷宫内移动对象。操作如下:

完成以上操作后,我们可以开始为场景添加光照了:

在查看场景后,我们可以重复上一步来添加更多光源,通过复制、移动所创建的OmniLight或为Spatial添加更多的OmniLight子节点如下:

小结

本章中,我们熟悉了室内环境的创建,并学习了如何通过内置对象如箱体、点光源或相机创建迷宫。我们还使用了此前学习的转换对象的知识来创建一个完整的作品。

更多内容:Godot从入门到精通系列文章

退出移动版