В чем разница между загрузкой сцены с .instance и использованием .new? - PullRequest
0 голосов
/ 14 апреля 2020

Работая в Годо 3.2, у меня есть сцена, Player.tscn. В верхней части Player.tscn у меня есть "class_name Player"

Теперь, когда я создаю экземпляр Player, у меня есть, насколько я вижу, два варианта:

player = Player.new()

или

player = load("res://Player.tscn").instance() as Player

Теперь, первая версия кажется мне лучшей ... но это явно не так. Если я использую .new(), он утверждает, что у него нет дочерних элементов, и любые вызовы методов, которые пытаются получить его дочерние элементы (например, .get_texture() на Sprite), производят такие вещи, как "Attempt to call function 'get_texture' in base 'null instance' on a null instance", потому что, по-видимому, Player не имеет детей.

Конечно, делая это вторым способом, все работает нормально. Но почему? Почему я не могу просто использовать .new(), если я зарегистрировал его как класс, используя class_name?

1 Ответ

1 голос
/ 18 апреля 2020

Я новичок в Godot, поэтому могу ошибаться, но думаю, это потому, что ключевое слово .new () - это языковая функция для загрузки отдельных классов / узлов,

, тогда как .instance () дополнительная функция движка, которая берет упакованную сцену, которая представляет собой комбинацию множества классов / узлов, и восстанавливает их относительное положение в дереве, присоединяет скрипты и ресурсы и т. д. c

Так что, если ваш игрок Сцена tscn, вы бы сделали что-то вроде:

var player = load("res://etc/Player.tscn").instance()
get_tree().root.add_child(player)
player.global_transform = etc ...

, который загрузит узел root в Player.tscn и всех его дочерних элементов (жестких тел, collidershapes et c) в Дерево сцены, установите их относительное положение, соедините сценарии и что у вас есть

Или, если ваш Player является классом или GDScript, вы можете сделать

var player = Player.new()
get_tree().root.add_child(player)
player.global_transform = etc ...

Что бы добавить объект узла root с одним узлом только в дереве сцены, но не дочерние элементы

После того, как он находится в дереве сцены и запущен _ready (), вы можете создавать экземпляры и присоединять узлы дочерних компонентов (.new ()> parent.add_child ()> установить преобразование) из самого скрипта

...