tutorial_singletons - seraph526/godot-se GitHub Wiki

单件(Singletons) /自动加载 (AutoLoad)

介绍 (Introduction)

场景单件非常有用,它们代表了很常用的使用情况,但是一开始还不是很清楚它们的价值在哪?

场景系统是非常有用的,但是它有一些缺陷: *没有在场景间共用的存储信息的地方(如分数,获得的物品等等) *可以制作一个场景加载和释放另一个它的场景子节点,但这样做没办法让单一场景独立的正常工作 *也可以使用"user://"存储固有信息到磁盘,让场景加载这些信息,但保存/读取操作在更换场景时是比较难处理的。

所以,使用Godot一段时间后,就会发现还是有必要有个东西能保存部分场景的内容: *经常加载的,无论场景是否从编辑器打开 *全局变量,如用户信息,道具,钱等等 *能解决切换场景和变换问题 *有一些东西功能像单件这样,因为GDScript是设计为不支持全局变量的

因为上述原因,要存在自动加载节点和脚本。

自动加载 (Autoload)

自动加载的可以是继承自节点(Node)的一个场景,或一个脚本(会创建一个节点,并给其填加一个脚本)。通过Scene -> Project Settings -> AutoLoad设置自动加载。

每个自动加载都需要设置一个name属性,这个名字就是节点的名字,这个节点通常会在场景加载前被填加到根视图(root viewport)。


var player_vars = get_node("/root/playervariables")

场景切换 (Scene Switcher)

这个小教程演示了如果使用自动加载制作场景切换。 首先,从这里下载模板:autoload.zip,然后打开它。

该项目有两个场景,scene_a.scn和scene_b.scn。两个场景一样,都包含一个按扭并链接了一个回调函数,回调函数的功能是跳到对应的场景。运行项目,开始的场景是scene_a.scn,但是,什么都不会发生,点击按扭也没反应。

global.gd

首先,创建一个global.gd脚本。简单的方法是创建从资源标签创建一个脚本资源:

在脚本编辑器中打开golbal.gd。接下来,将它填加到自动加载,执行Scene -> Project Settings -> AutoLoad,新建一个名为"global"的自动加载,并指向这个文件:

现在,当任意场景运行时,这个脚本都会被加载。 返到到编辑器,在_ready()函数中,当前场景会被捕获。当前场景和global.gd都是root的子节点,但是通常自动加载节点是第一个。也就是说,root的最后一个节点是加载的场景。

注意,确保global.gd继承自Node节点,否则它不会被加载。


extends Node

var current_scene = null

func _ready():
        var root = get_scene().get_root()
        current_scene = root.get_child( root.get_child_count() -1 )

接下来,编写改变场景的函数。这个函数会清除当前场景,并用请求的新场景替换当前场景:


func goto_scene(scene):
        var s = ResourceLoader.load(scene)
        current_scene.queue_free()
        current_scene = s.instance()
        get_scene().get_root().add_child(current_scene)

最后,剩下的就是编辑scene_a.gd和scene_b.gd中的函数:

#add to scene_a.gd

func _on_goto_scene_pressed():
        get_node("/root/global").goto_scene("res://scene_b.scn")

#add to scene_b.gd

func _on_goto_scene_pressed():
        get_node("/root/global").goto_scene("res://scene_a.scn")

最后,运行项目,它可以通过点击按扭在两个场景间切换了。 (要用使用进度条加载场景,请查看下一篇教程,[Background Loading](Background loading))