Создание экземпляра можно рассматривать как создание копий объекта из чертежа. Причина, по которой он экономит память и вызовы отрисовки, заключается в том, что, по сути, в памяти должен храниться только «план». Рекомендуемый способ решения этой проблемы (согласно документации) - использование (упакованных) сцен.
Для этого создайте объект как его собственную сцену - помните, что вы можете щелкнуть правой кнопкой мыши узел root сцены (даже пустой) и измените тип на какой хотите. Как только вы настроите объект так, как вам нравится, сохраните его как свою собственную сцену (например: myInstance.tscn
).
Оттуда вы можете вызвать экземпляр из вашей основной сцены (или любой другой сцены, которую вы нужно в). Для этого вам нужно сделать несколько вещей:
Сначала создайте переменную для вашего экземпляра в скрипте, из которого вы хотите его вызвать, объявив что-то вроде onready var instancedObject = preload("res://myInstance.tscn")
. (Используя любой путь, который вы использовали для сцены).
Оттуда вы вызываете переменную из любой нужной вам функции, записывая что-то вроде: var myObject = instancedObject.instance()
Затем вы должны добавить экземпляр в текущая сцена с add_child(myObject)
После этого вы можете (необязательно) указать такие вещи, как преобразования и вращения, чтобы определить, где будет помещен экземпляр (Пример: myObject.transform.origin = Vector3(0,10,0)
- для 3D или myObject.position = Vector2(10,0)
для 2D )
В качестве альтернативы вы можете инициализировать и создать экземпляр объекта одновременно, написав onready var instancedObject = preload(res://myInstance.tscn).instance()
, а затем добавив его в функции, используя add_child(instancedObject)
, однако, хотя для этого требуется меньше шагов, есть ограничения на выполнение это так, и я лично добился гораздо большего успеха, используя первый подход.
Если, однако, вы хотите создать несколько тысяч объектов (или более) в одной сцене, я рекомендую использовать ответ Калину и используя MultiMeshInstance
. Тем не менее, одним из ограничений MultiMeshInstance
является то, что он использует подход к рисованию «все или ничего», то есть все экземпляры будут либо рисоваться сразу, либо не рисоваться совсем. Промежуточного нет. Это может быть хорошо или плохо, в зависимости от того, для чего вам это нужно.
Надеюсь, это поможет.