比较简单粗暴的方法,没有缓存,即用即加载。先把 UI的tscn 都放到一个文件夹中,也可以指定子文件夹
extends Node
signal ui_opened(ui_name)
export(String, DIR) var ui_dir:String
func open(ui_name:String,msg:Dictionary = {},sub_dir:String= "/",suffix:String = ".tscn")->void:
var ui:Node = null
if has_node(ui_name) :
ui = get_node(ui_name)
else:
var scn := load(ui_dir + sub_dir + ui_name + suffix) as PackedScene
if scn != null and scn.can_instance():
ui = scn.instance() as Node
add_child(ui)
if ui != null:
move_child(ui,get_child_count() - 1)
ui.name = ui_name
if ui.has_method("open"):
ui.open(msg)
emit_signal("ui_opened",ui_name)
else:
Logger.error("Failed to open UI:" + ui_name)
func close(ui_name:String)->void:
if has_node(ui_name):
var ui := get_node(ui_name)
remove_child(ui)
ui.queue_free()
func close_all()->void:
for ui in get_children():
remove_child(ui)
ui.queue_free()