Это сложно объяснить набором текста ...
У меня есть сцена GameController (Node2D), которая содержит 3 сцены внутри:
- Мышь (сцены / Mouse.tscn) - просто меняет курсор мыши на пользовательскую графику.
- HeaderBar (сцены / HeaderBar.tscn) - это счет / метка, которая находится наверху
- Сообщения (сцены / Messages.tscn) - это всплывающее окно сообщения, которое отображает текст для пользователя
В основной сцене (Level1.tscn) я использую сцену GameController, и она отлично работает. Там есть панель заголовка с оценкой / меткой, а также пользовательский курсор мыши и окно сообщения (но по умолчанию оно скрыто, но если я переключу его видимость на пульте дистанционного управления, оно появится).
Вот в чем мое замешательство ...
Если я попытаюсь в сценарии GameController манипулировать любыми из этих узлов в сцене GameController (мышь, заголовок, сообщения), они вернутся как null и выдадут ошибку. Например; если я попытаюсь обновить счет в $ HeaderBar / Control / score, я получаю следующее:
Invalid set index 'text' (on base: 'null instance') with value of type 'String'.
Завершение кода будет автоматически заполнять имена узлов по мере их ввода (чтобы он распознавал их в группе), но любая попытка ссылаться / использовать их в скрипте вызывает ошибки, аналогичные приведенным выше.
Я новичок в Годо, поэтому уверен, что у меня просто какое-то недоразумение относительно того, как работает этот тип вещей, но я в тупике! Любое понимание очень ценится!
ОБНОВЛЕНИЕ
Я постараюсь немного упростить свое объяснение (я внес некоторые изменения). Хорошо, вот сценарий объекта:
extends StaticBody2D
onready var main = load("res://scenes/MainGame.gd").new()
func _ready():
pass
# mouse [left] clicked on object
func _on_trigger_input_event(viewport, event, shape_idx):
if Input.is_action_just_pressed("left-click"):
main.display_message("you [left] clicked on the object!")
вызов main.display_message () работает. Он действительно вызывает функцию, но вот эта функция в MainGame.gd
extends Node2D
onready var box = $Message/Control
onready var label = $Message/Control/Label
func _ready():
# hide the mouse cursor (will use custom cursor)
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
func display_message(msg):
label.text = msg
box.visible = true
Это происходит из-за того, что метка (и поле) равны нулю. Если я вызываю display_message из функции _ready (в MainGame.gd), он работает как надо. Вызовите его извне (в Object.gd), и по какой-то причине узлы будут нулевыми.
extends CanvasLayer onready var message_shell = $messageShell onready var message_label = $messageShell/messageBox/Label func _ready(): print(message_label.text) func display_message(msg): print("yes boy... yes!!") message_label.text = str(msg) # message_shell.visible = true
инструкция _ready print работает. Когда я вызываю функцию display_message (из сценария игрового контроллера), она снова выдает ошибку (нулевой экземпляр). Не знаю, как это правильно отформатировать ... - person JeremyPage   schedule 04.06.2021display_message
для экземпляра, который вы не добавляли в дерево сцены. Как выглядит код, из которого вы его вызываете? Также добавьте код вопроса, вы можете его редактировать. - person Theraot   schedule 04.06.2021