description |
---|
Get access to nodes anywhere in the project |
First, we define a global object, Teleport that will allow us get reference to other nodes registered with it.
Teleport.gd
extends Node
var nodes = {}
func get(node_name: String) -> Node:
var config = nodes[node_name]
return config.root.get_node(config.path)
func add(root: Node, exports: Dictionary) -> void:
for node_name in exports:
if nodes.has(node_name):
push_error("Teleport already has node with name '" + node_name + "', skipping...")
continue
var node_path = exports[node_name]
nodes[node_name] = {
root = root,
path = node_path,
}
Then we create a dynamic way to have exports in a node. This is a SmartNode2D class
SmartNode2D.gd
tool
extends Node2D
var exports = {}
func _get(property):
if exports.has(property):
return exports[property]
func _set(property, value):
if exports.has(property):
exports[property] = value
return true
func _get_property_list():
var list = [{
name = "Exports",
type = TYPE_NIL,
usage = PROPERTY_USAGE_CATEGORY | PROPERTY_USAGE_SCRIPT_VARIABLE
}]
for var_name in exports.keys():
list.append({
"hint": PROPERTY_HINT_NONE,
"usage": PROPERTY_USAGE_DEFAULT,
"name": var_name,
"type": TYPE_NODE_PATH
})
return list
func _ready():
Teleport.add(self, exports)
Declare, set nodes in UI
tool
extends "res://Src/SmartNode2D.gd"
func _init():
exports = {
top_screen = "", # "TopScreen",
progressives = "", # "TopScreen/Progressives",
}
Then use them
onready var top_screen = Teleport.get("top_screen")
onready var progressives = Teleport.get("progressives")