Чтобы понять разницу между этими функциями, вам нужно помнить, что объектная модель в Unreal Engine основана на прототипах объектов, очень как в JavaScript. Каждый UClass связан с экземпляром по умолчанию соответствующего класса UObject, называемого объектом по умолчанию класса (CDO), который сначала выделяется, а затем создается, только один раз , через конструктор класса при инициализации механизма. CDO действует как шаблон, из которого копируются все другие экземпляры класса, и конструктор никогда больше не вызывается.
Это означает, что конструкторы класса не могут содержать логики времени выполнения c и должны использоваться только для инициализировать CDO и его свойства. Если класс содержит какие-либо подобъекты, такие как компоненты акторов, они должны делать то же самое, поэтому их собственные объекты по умолчанию должны быть созданы в первую очередь. Фактическое создание объекта должно затем быть отложено после инициализации движка, чтобы каждый раз, когда новый экземпляр класса запрашивался для создания с помощью нормального кода игрового процесса, родительский объект и все его подобъекты создавались из их соответствующих значения по умолчанию.
Таким образом, для обработки всех различных сценариев ios, в которых может быть создан объект, необходимо несколько способов создания объектов.
UObject::CreateDefaultSubobject
вызывается только в конструкторе класса и заботится о создании экземпляра CDO класса подобъекта, устанавливая его внешний класс в качестве объекта вызывающей стороны, среди прочего. Созданный объект затем становится объектом по умолчанию для свойства, когда создается его класс объекта.
NewObject<T>
- это функция, обычно используемая для создания экземпляров объектов после инициализации движка во время обычного игрового процесса. Он предоставляет несколько удобных перегрузок для обработки большинства сценариев ios.
UWorld::SpawnActor<T>
- это удобный метод для вызова актеров на уровне с указанным местоположением и вращением, настройками столкновения икры и проверяет, является ли он порождаемым классом актера и является не более чем оболочкой NewObject<AActor>
.
ConstructObject
удалено в пользу NewObject
.
Я рекомендую проверить исходный код движка для получения дополнительной информации, особенно UObject / UObjectGlobal. cpp и UObject / UObjectGlobal.h в модуле ядра CoreUObject. Внутренне все эти функции в конечном итоге вызывают (по состоянию на 4.24) StaticConstructObject_Internal
, который обрабатывает фактическое создание объекта.