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))