📚 欢迎来到 Godot 新手村教程中心!
这里是新手村的知识宝库,汇集了丰富的 Godot 学习资源,帮助你从零基础到游戏开发高手!
B站UP主 落叶轻羽 是国内知名的Godot引擎学习资源贡献者,专注于2D游戏开发教程领域。他通过精心筛选YouTube上的优质Godot教学视频,进行专业的翻译、配音和本地化处理,为中文社区提供了大量高质量的学习资源。目前频道已积累超过350个视频,内容涵盖从零基础入门到进阶开发的完整学习路径。
图块地图(Tile Map)是Godot中功能强大的2d地图制作节点,由于TileMap在Godot4.5已废弃,且与TileMapLayer使用其实差异不大,故本篇主要讲解 TileMapLayer。本篇为快速教程,指在方便用户快速上手TileMapLayer。
相关信息
在Godot 4.3之后的版本添加了TilemapLayer替代原有的Tilemap节点,使每层瓦片地图都可以使用不同的tileset以及物理数据等,解决了之前版本中Tilemap在某些复杂场景下的局限性。
在本教程中,如果没有特殊说明,以下知识默认均使用TilemapLayer讲解。Tilemap与TilemapLayer除了API有部分区别外,其余部分均可通用。
本教程将通过实现一个画图软件,演示画图、选色、图层等核心功能。
完成该教程后,你将会对鼠标事件、Image、ImageTexture、自动加载等相关知识点有一定了解。
想象一下这样的场景:你的玩家在游戏中辛辛苦苦打了三个小时,终于攒够了装备、升到了满级、解锁了所有成就。但当他们关闭游戏再次打开时,却发现一切从头开始——所有的进度都消失了,就像从未玩过一样。
或者你想制作一款剧情丰富的RPG游戏,玩家的每个选择都会影响后续的故事走向。但如果没有存档系统,玩家就必须一口气通关,否则所有的选择和进度都会丢失。
再比如,你想让玩家自定义游戏设置——音量大小、画质选项、按键绑定。如果这些设置无法保存,每次启动游戏都要重新调整,这会让玩家非常抓狂。
那么,如何让这些珍贵的游戏数据在关闭游戏后依然保留呢?
答案是文件读写与存档系统。
在现代游戏开发中,存档系统是几乎所有类型游戏的必备功能。无论是RPG的进度保存、动作游戏的检查点、还是简单的设置保存,都离不开文件读写操作。
在Godot中,我们有多种方式来实现文件的读写和数据持久化——ConfigFile、JSON、二进制文件、资源文件、数据库等。每种方式都有其适用场景。
想象一下这样的场景:你正在制作一款RPG游戏,玩家在村庄地图收集了100枚金币,然后进入了森林地图。此时你发现玩家的金币数据丢失了,因为场景切换后,原来的节点树被销毁了。
或者你想制作一个背景音乐播放器,希望音乐能在不同场景间连续播放。但每次切换场景,音乐都会重新开始,因为AudioStreamPlayer节点跟随场景一起被重新创建了。
再比如,你想在游戏的任何地方都能调用一个暂停功能,或者记录游戏设置。如果把这些功能分散在各个场景中,不仅代码会重复,还很难保证数据的一致性。
这些问题的本质都是一样的:如何创建一个在整个游戏生命周期中始终存在的节点?
在Godot中,这个问题有一个优雅的解决方案——自动加载(AutoLoad)。
在开发游戏的过程中,往往会出现这样的情况:
我们可能会有以下思路:
get_node("hp_bar").update_value(hp_value)get_parent().do_something(hp_value)hp_bar.player = self,然后在血量的process函数中update_value(player.hp_value)很容易发现以上代码中,传输数据是一件很不方便的事情。尤其是我们不可能将所有代码全部放在一个庞大的game.tscn场景文件中,这使得节点之间的交互更是一件复杂的事情。
那有什么办法可以简化这种操作呢?或者说,如何将一个事件,和处理这个事件的函数解绑呢?
答案是信号signal。
着色器相关文档:Godot文档-着色器简介
着色器是一段程序。借助强大的并行计算能力,计算机显卡可以在每次渲染帧中为纹理的每一个像素调用一次着色器程序,并生成新的纹理。
由于是并行运行的程序,所以每一个像素并不知道相邻像素的执行结果。也没有办法将每次执行的结果存储起来传给下一次运行。
在游戏开发中,有两种主要的架构模式:继承模式和组件模式。
当你完成了游戏中的角色控制,可以操作像素小人肆意的奔跑在绿色草地上的时候,也许你会想:为什么我要亲自动手?他能不能自己跑起来?那么好,Godot确实为你这个想法提供了支持,他就是导航系统。
让一个像素小人从一个点移动到另一个点,听起来一点也不复杂,甚至你完全可以自己编写代码让你的像素小人一格一格移动到目标点。