初学者做游戏用godot还是unity好?
作者:卡卷网发布时间:2025-01-01 15:19浏览数量:101次评论数量:0次
Godot4.3中将会移除Tilemap节点,改为TilemapLayer。这让我意识到是时候编写一期关于Godot中的tilemap的使用指南了。关于TilemapLayer对于原来Tilemap的修改,其实就是移除了原来Tilemap的Layers属性,对此的解释是更符合Godot的设计哲学,简化检查器并将Layer概念改为Node(也就是多个TilemapLayer节点)这一点我们会在后文中详细说明。这篇文章,我将尝试为你由浅入深的介绍godot4中的tilemap相关节点的使用。
<>【老李游戏学院】一文搞懂Godot4中的Tilemap相关知识>
Godot4.3中将会移除Tilemap节点,改为TilemapLayer。这让我意识到是时候编写一期关于Godot中的tilemap的使用指南了。关于TilemapLayer对于原来Tilemap的修改,其实就是移除了原来Tilemap的Layers属性,对此的解释是更符合Godot的设计哲学,简化检查器并将Layer概念改为Node(也就是多个TilemapLayer节点)这一点我们会在后文中详细说明。这篇文章,我将尝试为你由浅入深的介绍godot4中的tilemap相关节点的使用。
什么是Tilemap?
Tilemap技术并不是Godot引擎特有的,而是在2D游戏开发中非常常见且很成熟的技术。在开始本教程前,我们有必要回答下“什么是Tilemap(瓦片地图)?”
<>Tilemap(瓦片地图)是指由小方块(Tile瓦片)组成的二维地图,在游戏开发中常用于构建游戏世界的背景和场景>。瓦片地图可以看作是一个二维数组,数组中的每个元素代表一个瓦片,通过组合不同的瓦片,可以构建出复杂的地形、建筑物、道路等环境。
Tilemap在2D游戏开发中的应用非常广泛,特别是在像素风格或类似于复古游戏的场景中。<>它的优点包括节省内存和处理器资源,便于设计师快速构建和修改游戏地图,同时可以实现高效的渲染和碰撞检测。>通过合理的设计和利用,Tilemap可以帮助开发者轻松地创建出富有层次感和细节感的游戏世界。
Godot中的Tilemap
熟悉Godot游戏引擎的同学大概知道,Godot游戏引擎的Tilemap节点几经改版,在目前的Godot4版本中趋于完,要掌握Godot的Tilemap,需要了解Tilemap和Tileset以及两者之间的关系。先让我们做一个宏观的介绍。
正如我在前文中提到的,godot4.3中移除了Tilemap节点,改为TilemapLayer,但两者之间的差别仅仅在于后者移除了Tilemap的Layers属性。本文将以Godot4.3中的节点为准,但如果你使用的是之前的版本,也不要担心,两者的差别没有想象中那么大。
<>TilemapLayer是一个节点Node>,用于在游戏中创建瓦片地图。<>TilemapLayer节点本身并不存储地图的图像数据,而是通过引用一个Tileset资源来确定地图中每个瓦片的外观和属性。>
<><>Tileset则是包含了一组瓦片图像的资源Resoce>。每个瓦片图像代表地图中的一个元素,如地面、墙壁、树木等。Tilemap节点使用Tileset来绘制地图,从而构建游戏世界的背景和场景。
用一个不太恰当的方说明两者之间的关系,TilemapLayer和Tileset类似画布和画板之间的关系。画布是实际绘制图像的地方,而画板则提供了绘制图像所需的工具和资源。类似地,Tilemap节点是用于绘制瓦片地图的容器,而Tileset则提供了绘制瓦片所需的图像资源和属性信息。
在场景编辑器中右键添加节点选择TilemapLayer之后,就可以为当前的TilemapLayer指定Tileset或创建新的Tileset。
总的来说,Tilemap节点负责瓦片地图的布局和渲染,而Tileset则提供了瓦片地图中每个瓦片的外观和属性,两者共同协作,实现了游戏中瓦片地图的创建和展示。了解了两者之间的关系,我们就可以展开讲解。
瓦片图集Tileset
“TileSet是TileMap的图块库。TileSet处理TileSetSoce列表,每个表中存储一组图块。
图块既可以来自TileSetAtlasSoce,可以渲染纹理中的图块,支持物理、导航等功能,也可以来自TileSetScenesCollectionSoce,提供基于场景的图块。
图块通过使用三个ID来引用:源ID、图集坐标ID、备选图块ID。
TileSet可以配置图块暴露哪些属性。为了做到这一点,TileSet资源使用了属性层,你可以根据需要进行添加和删除。
例如,添加物理层可以为瓷砖提供碰撞形状。不同的层都有不同的属性(物理层和遮罩),要实现不同类型的碰撞,你也可以添加多个TileSet物理层。”
以上是对于Tileset的描述,这里需要解释几个概念,首先是TileSetSoce。
Godot4中的TileSetSoce派生出TileSetAtlasSoce和TileSetScenesCollectionSoce,这个我们后面会讲。
每个TilesetSoce都有一个源ID(soceID),想要找到对应的Tile,需要指定SoceID、图集坐标和备选图块ID。这涉及到我们如何在脚本调用相关的API,这个我们依然后文详述,这里大家先有个印象。
为tileset添加图集时会弹窗提示,是否自动创建图块。
选择图集后,就可以针对“设置”、“选择”和“绘制”来详细设置图块属性。
TileSetShape形状
godot中提供包括正方形、正交视图、半偏移方形和六边形等多种Tile形状可供开发者选择,基本涵盖了常见的2D游戏中对Tilemap的需求,包括传自顶向下2D游戏、横版游戏、战棋游戏和伪3D游戏等。
这里说句题外话,为什么战棋游戏常常采用六边形网格的地图?这个话题或许值得我们单用一篇文章来讲解,无论从游戏设计、技术实现还是游戏文化背景等多方面都值得我们游戏开发者了解。这里再挖一坑,咱们后续找时间详细聊聊。
TileSet设置
设置选项卡可以看作是对TileSetAtlasSoce的基础设置,这里可以指定TileSetAtlasSoce的ID、名称、纹理、边距、图块间距、纹理区域大小和是否使用纹理内边。
上图所示的六边形Tileset中,尽管TileSize设置为32*32。但TileSetAtlasSoce的纹理区域大小则设置为32*48,才能保证其在游戏中可以正常显示:
类似例子在Tilemap使用中并不鲜见。
TileSet选择
“选择”选项卡是对于单个图块的详细设置,选择某个图块后,可以看到当前图快的图集坐标、图集中尺寸,还可以进一步设置动画、渲染、地形和杂项。
动画选项卡可以实现图块简单的序列帧动画,如流动的水面效果等。
渲染选项卡可以设置当前图块的纹理原点、指定材质、设置Z索引并定义Y排序的原点。这些概念都不是图块特有的,我们只需要知道在哪里设置就可以。
地形概念我们会在下文中详述,这里暂时跳过。
杂项目前只包括概率,这是在随机绘制多个纹理中随机1个时定义随机权重的。很好理解。
TileSet绘制
“绘制”选项卡有两个功能,其一是包含“选择”选项卡中的属性,但通过绘制赋值的方式将属性赋值给选择的图块,其二则是多出地形、物理、导航和自定义数据等概念。这里我们详细说明。
无论是地形、物理、导航还是自定义数据都需要先为当前TileSet资源添加对应的层。
地形绘制
地形包括三种模式,分别是按边角匹配、按边Sides匹配和按角Corners匹配。地形设置可以看作是一种简化的规则地形,通过设置mask规则,可以在绘制图块时自动选择合适的图块。如何设置?
以上图为例,选择地形模式为MatchCornersandSides(边角匹配)。这种情况下每个图块可以被拆分为九宫格。
如果一个图块的某个方向存在图块,则设为掩码,否则不设置。以下图为例,当前图块的左上、正上和右上为空,所以不设置掩码,方向有图块因此设置掩码,图块都已相同规律绘制。
但要注意的是,如果按边角匹配,需要提供满足条件的足够多的图块,否则会在绘制时出现错误。设置好整个地形图的掩码数据后,就可以在场景中的TilemapLayer节点绘制地形了。
物理层与导航层绘制
与地图集类似的,物理层和导航层也需要在Tileset资源检查器中添加。
Tilemap物理层概念与Godot中物理层概念一致,包括碰撞层和碰撞掩码层,简单理解就是Tile所在的碰撞层和所能够产生碰撞的层。
添加物理层之后,就可以在绘制选项卡设置图块的物理层,左侧可以定义单个图块的物理形状,但注意这里不是为某个图块绘制物理形状,可以理解为设置一种物理形状的“笔刷”,之后需要按当前笔刷样式点选右侧图块完成物理图块的赋值。
导航层设置与物理层类似,关于Godot4提供的导航模块,老李计划在AI模块精讲时候再详细探讨,这里大家只要知道如何使用即可。
自定义数据设置
godot4允许用户为图块添加自定义数据,通过CustomDataLayers添加新的自定义数据元素,编辑数据名称和数据类型,之后就可以在TileSet编辑器的“绘制”选项卡对图块赋值。
在godot3以及之前的版本,因为Tilemap没有提供Tile的自定义数据功能,我们往往需要自定义变量来存储坐标位置对应的自定义数据,现在Godot原生提供图块的自定义数据,算是弥补了这方面的不方便,这在开发类似模拟经营、种田等和图块存在交互的游戏中尤为重要。
至于自定义数据如何在脚本代码中使用,这个我们在下文中再详细讨论。
图并工具
在TileSet编辑弹窗中有一个容易被人忽略的按钮,就是在左下方的”打开图并工具“,这个工具可以将多个图片合并为图集,这样可以避免左侧列表中每个图集(的图块图片)只有一个图块,可以节省性能开销。
瓦片地图节点TileMapLayer
在对TileSet有了基本的了解之后,是时候了解TilemapLayer节点了,在Godot编辑器中选择某个TileMapLayer节点,此时你的编辑器应该类似上图所示。
这里首先关注右侧检查器中属性设置,可以看到除了最主要的TileSet资源的设置外,还可以为当前TileMapLayer定义包括渲染、物理和导航等相关内容的设置。
然后就是我们的重头戏,编辑器下方的TileMap编辑窗口。
图块
编辑窗口左上角包括三个选项卡,分别是图块、图案和地形,这其中图块最常用。
关于图块的理解很简单,几乎是TileSet的延续,当我们在TileSet中添加了图块,就可以在TileMap中找到对应的图块,当然,图块本身也是属于某个图集或场景的。
选择好图集中的某个图块,现在就可以在场景中绘制了。
Godot提供了多种绘制方式,包括:点、线和面绘制,还包括一个很不常用的油漆桶工具。此外,编辑窗口左上角还能看到图块选择工具、取样和橡皮擦工具。
橡皮擦工具右侧则是4个方向变换工具,包括向左转、向右转、水平翻转和垂直翻转等,常用但不显眼。
转向工具右侧是一个骰子图标,代表随机从多个图块中选择图块绘制在场景TileMapLayer节点上。
随机概率在哪里设置?没错,同学们应该还记得在TileSet编辑弹窗的选择和绘制中可以设置图块的概率。
TileMap编辑框右上角是关于图层的设置,可以选择上下不同层的TileMapLayer节点,也可以全选。最右侧的三个图标分别是高亮显示所选TileMapLayer、Tilemap栅格可见性和自动将图块切换为。前两者很好理解,第三个什么意思,老李也不知道。等用到再说吧。
图案
图案是对图块预设的保存,使用选择工具在场景的TileMapLayer节点上选择多个图块并拖到图案窗体内就可以保存图案。图案提供了一种很便利的图块预设复用方式,使用简单,这里就不多着墨了。
地形
地形选项卡以树状结构显示当前TileSet中设置的所有地形集以及其保存的相关地形。
地形的绘制有两种:链接模式和路径模式。简单来说,链接模式适合绘制地面,路径模式适合绘制线形如道路、篱笆墙等。
如何在GDScript中使用
在Godot编辑器中所有对于TileSet和TileMap的设置都可以在代码中完成,换言之,Godot编辑器只是提供给开发者一种具象化的、所见即所得的编辑工具。其核心依然是由C++开发的代码组成的,并且暴露足够的API给GDScript调用。
理解了这一点,就不难理解如何在代码中使用Tilemap。老李整理了相关类型如下:
正如文档所说,Godot中用TileData保存对TileSet上单个图块的设置。
TileData提供了获取自定义数据的方法,在实际游戏开发中,我们需要先调用TileMapLayer提供的get_cell_tile_data方法获取TileData,然后调用其提供的get_custom_data就可以获取自定义数据层所对应的值。
TileSet是继承自Resoce类型的,因此可以序列化和反序列化。Godot中的资源类型,默认以tres后缀储存的文本文件,因此我们可以使用外部工具(如VSCode)打开它。
通过外部工具查看序列化后的数据我们能够得知TileSet通过图集-坐标的方式标记单个图块,并对齐属性进行赋值:
例如,上述0:0/0表示图集坐标(0,0)且备选为0的图块。
后面几行则是关于地形掩码设置的数据表示。
之后是TileSetSoce,经过上文中的讲解,我们已经知道TileSet可以看作是TileSetSoce的,重点是Godot4中TileSetSoce可以派生出两者分别是图集和场景。
TileSetAtlasSoce就是我们最常用的图块图集。前文中我们已经介绍了图块图集提供了哪些属性,在GDScript的API中主要是对于这些属性的Get和Set方法。
TileSetScenesCollectionSoce是场景,可以将场景像图块一样在TileMap中使用,场景相对简单,没有什么值得关注的属性。值得注意的是,场景中的场景,会在游戏运行时实例化并作为子节点添加到对应TileMapLayer下。
因为场景文件以tscn为后缀的文本文件,因此依然可以使用外部工具打开。
打开之后可以看到TileMapLayer使用一个PackedyteArray数据保存图块信息。
不过,值得注意的是这其实是Godot4.3改版之后的数据,在此之前是使用PackedInt32Array保存图块数据的。如上图所示。
要想获得TileMapLayer中某个图块的属性,大多数时候需要提供coords,也就是在TileMapLayer中的坐标位置。
设置图块则是调用set_cell方法,提供TileMapLayer中的坐标点,TileSet中图集的ID、图块在图集中的坐标和备选坐标。如果图集是场景合集,则atlas_coords属性应该是Vector2i(0,0),并且alternative_tile代表场景ID。
此外,TileMapLayer节点还提供了map_to_local和local_to_map方法,方便开发者在本地坐标和Tilemap坐标之间转换。
本章总结
本章,我们用一篇文章尝试讲清楚Godot4中的Tilemap相关节点。特别是针对Godot4.3之后的修改。后续我会通过一个“种田游戏”demo来演示如何在实际项目中使用tilemap并发挥其最大作用。
s://t.zsxq/13WrY16iX(二维码自动识别)
大家加油!
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:中文站有很多死链怎么办?一般都在哪里处理的?
- 下一篇:怎么速成C#?
相关推荐

你 发表评论:
欢迎