Попытка вызвать функцию «get_position» в базовом «нулевом экземпляре» для нулевого экземпляра. ОШИБКА

Я пытаюсь создать шутер с видом сверху с игроком и пулей на отдельной сцене. Но всякий раз, когда я запускаю игру, она говорит

Попытка вызвать функцию «get_position» в базовом «нулевом экземпляре» для нулевого экземпляра.

Кстати, я новичок в Godot.
Кажется, проблема в этой функции:

const SPEED = 300
var bullet = preload("res://Mini-Scenes/Bullet.tscn")

func shoot():
    var b = bullet.instance()
    add_child(b)
    b.set_position(position)
    b.move_and_slide(Vector2(1, 0).rotated(rotation) * SPEED)

И я также не думаю, что понимаю, как работает создание экземпляров, поэтому мои вопросы:

  1. Как работает создание экземпляров?
  2. Что приводит к сбою вышеуказанной функции?

person Jooney    schedule 12.08.2019    source источник
comment
Я тоже новичок, и недавно у меня была похожая проблема, я пытался создать проигрыватель и основную сцену вместе, и я думаю, что вы не можете использовать функцию get_position, если родительский узел является Node2D (как обычно, карта). Можете ли вы попробовать перенести функцию стрельбы на сцену с пулей или игроком?   -  person Sandstorm    schedule 13.08.2019
comment
Attempt to call function 'get_position' in base 'null instance' on a null instance означает, что система не может найти то, что вы запрашиваете. Попробуйте изменить свой var bullet на onready var bullet. Если по-прежнему не работает, попробуйте изменить b.set_position(position) на b.position = position.   -  person Christopher Bennett    schedule 15.08.2019
comment
Я изменил Node2D на Node, но он все равно не работал.   -  person Jooney    schedule 15.08.2019
comment
Я забыл упомянуть ... если ни одно из моих предложений выше не работает, попробуйте добавить маркер с помощью get_parent().add_child(b)   -  person Christopher Bennett    schedule 15.08.2019


Ответы (1)


Хорошо, по порядку:

  1. Создание экземпляра в принципе простое. Годо берет основу Node сцены и всех ее дочерних элементов и копирует их в память. Затем, когда вы добавляете этот Node в качестве дочернего элемента к другому в сцене, вызывается _ready, Node начинают _process и _physics_process, а также некоторые другие вещи, такие как события приема (поскольку Node должен находиться внутри SceneTree, чтобы взаимодействовать с другими узлами, и наиболее распространенный способ добавить один к дереву - сделать его дочерним по отношению к другому).

Для получения дополнительной информации см. документацию по созданию экземпляров

  1. Вышеупомянутая функция на самом деле работает безупречно, я только что создал новый проект в Godot 3.1.1 и продублировал вашу настройку, никаких ошибок не возникает. Проблема должна быть где-то еще в вашем коде или настройке сцены, и нам нужно будет увидеть ваш полный сценарий и макет сцены, чтобы определить причину проблемы. Если вы обновите свой вопрос этой информацией или отправите мне сообщение в Discord (Mantissa # 2558), я смогу полностью ответить на ваш вопрос.
person Dylan Culfogienis    schedule 15.08.2019