ERROR: "Invalid get index 'points' (on base 'null instance')" (Godot)

ERROR: "Invalid get index 'points' (on base 'null instance')" (Godot)

我正致力于为我的游戏添加类似升级的系统,但在 get_tree().get_root().get_node() 方面遇到了一些麻烦。

我试图在多层上检索不同的节点,但出现错误
ERROR: Attempt to call function 'get_root' in base 'null instance'\ on a null instance. 如果我是对的,这意味着它找不到树中的节点。

我也尝试过使用 get_parent().get_parent()... 以及 get_node("../../../.. ..."),但没有成功。

要获取的变量(pointspointsAdder

extends Area2D

var points = 0.000000000001
var pointAdder = 1
var pointMultiplier = 1
var mouseover = false
var unit 


var defaultArrow = load("defaultCursor_16x16.png")
var clickableCursor = load("clickableCursor.png")

func _ready():
    get_parent().get_node("scoreLabel").text = "Logs: 0"

func _input(event):
    if mouseover and event is InputEventMouseButton and event.pressed and event.button_index == BUTTON_LEFT:
        points = (pointAdder* pointMultiplier) +points
        if points < 1000:
            set_label_text(points)
        elif points >= 1000 and points < 1000000:
            set_label_text(str(points / 1000) + " K")
            unit = "thousand"
            set_unit_text()
        elif points >= 1000000 and points < 1000000000:
            set_label_text(str(points / 1000000) + " M")
            unit = "million"
            set_unit_text()
        elif points >= 1000000000 and points < 1000000000000:
            set_label_text(str(points / 1000000000) + " B")
            unit = "billion"
            set_unit_text()
        elif points >= 1000000000000:
            set_label_text(str(points / 1000000000000) + " T")
            unit = "trillion"
            set_unit_text()

    elif Input.is_key_pressed(KEY_SPACE) and not event.is_echo():
        points = (pointAdder* pointMultiplier) +points
        if points < 1000:
            set_label_text(points)
        elif points >= 1000 and points < 1000000:
            set_label_text(str(points / 1000) + " K")
            unit = "thousand"
            set_unit_text()
        elif points >= 1000000 and points < 1000000000:
            set_label_text(str(points / 1000000) + " M")
            unit = "million"
            set_unit_text()
        elif points >= 1000000000 and points < 1000000000000:
            set_label_text(str(points / 1000000000) + " B")
            unit = "billion"
            set_unit_text()
        elif points >= 1000000000000:
            set_label_text(str(points / 1000000000000) + " T")
            unit = "trillion"
            set_unit_text()
            
func _on_Area2D_mouse_entered():
    
    Input.set_custom_mouse_cursor(clickableCursor)
    
    mouseover = true

func _on_Area2D_mouse_exited():
    
    Input.set_custom_mouse_cursor(defaultArrow)

    mouseover = false

func set_label_text(text_to_send):
    get_parent().get_node("scoreLabel").text = ("Logs: "+str(text_to_send))

func set_unit_text():
    get_parent().get_node("scoreUnitLabel").text = unit

以及我试图在其中检索它们的代码:

Extends Button

var points_cost = 10

func _on_Button_down():
    
    if get_tree().get_root().get_node("treeClickableArea").points >= points_cost:
        points_cost = (points_cost/2) + points_cost
        get_tree().get_root().get_node("treeClickableArea").pointAdder = get_tree().get_root().get_node("").pointAdder + 1
        get_tree().get_root().get_node("treeClickableArea").points = get_tree().get_root().get_node("treeClickableArea").points - points_cost

\节点树:

┖╴Spatial
  ┠╴○ backgroundMap2
  ┠╴▦ backgroundMap
  ┠╴☺  scoreBackground
  ┠╴Tᵀ scoreLabel
  ┠╴Tᵀ scoreUnitLabel
  ┠╴☺  logSymbol
  ┠╴▭ treeClickableArea
  ┃ ┠╴☺ treeSprite
  ┃ ┖╴treeCollider
  ┠╴☺ upgradeBackground
  ┖╴▣ tabContainer
    ┠╴▯ perClick
    ┃ ┠╴perUpgradeScroll
    ┃ ┃ ┖╴▬ Button [scriptHavingIssuesHere]
    ┃ ┖╴Tᵀ Label
    ┖╴▯ perClickMultiplier

有人能解释一下为什么我会收到这个错误吗?这到底是什么意思?谢谢你的时间,非常感谢任何帮助。

好的,再次编辑。我保留了之前编辑的代码,以备您需要时参考。我称它为 EDIT#1。

我发布的新示例来自我制作的一个非常简单的测试程序。我将其命名为 EDIT#2。


编辑#2 - 测试程序

好的,所以我制作了一个简单的 2D 场景,其中仅包含一个根节点和 2 个我命名为 "Test1" 和 "Test2" 的精灵。我将脚本附加到两个精灵节点,每个节点都包含一个名为 "points" 的变量。在第一个脚本中,我制作了 points = 60,000,000,在第二个中,我制作了 points = 16。在第一个脚本 (Test1) 中,我使用 onready var testNode 加载 Test2 节点并将其存储为变量 testNode。然后我创建了一个简单的输入事件,当我按下分配给 "move forward" 的键时打印 testNode 变量的 points 值。预期的结果是将值 16 打印到控制台,尽管两个脚本都包含一个名为 points 的变量,每个变量都有不同的值(以证明我从第二个脚本中获取数字)。对我来说,它工作得很好。这是我用于脚本的代码:

节点设置

-Node2d
--Test1(sprite) - script 1
--Test2(sprite) - script 2

脚本 1 -

extends Sprite

var points = 60000000
onready var testNode = get_parent().get_node("Test2")

func _input(event):
    if Input.is_action_just_pressed("move_forward"):
        print(testNode.points)

脚本 2 -

extends Sprite

var points = 16

希望这个精简的示例可以帮助您深入了解正在发生的事情。希望对你有帮助。


编辑#1 -(上一个)新代码示例 - 供参考

我更改了代码以更好地反映我们的讨论。这是最终形式的外观。请注意,为了清楚起见,我将变量 treePoints 的名称更改为 treeClickNode

 extends Button

    var points_cost = 10
    onready var treeClickNode = get_tree().get_root().get_node("treeClickableArea")

    func _on_Button_down():
        if treeClickNode.points >= points_cost:
            points_cost = (points_cost/2) + points_cost
            treeClickNode.pointAdder +=  1
            treeClickNode.points =  treeClickNode.points  - points_cost