Unreal Engine 4. Различные способы создания объекта - PullRequest
1 голос
/ 02 февраля 2020

Я нашел около четырех разных способов создания объекта, но не уверен, что мое понимание ясно.

  • NewObject<T>() функция, используемая, когда мы хотим сделать в экземпляре UObject , Например, это могут быть любые ActorComponents.

    USomeComponent sc = NewObject<USomeComponent> (class);

  • ConstructObject<T>() еще один способ инициализации UObject ...

  • CreateDefaultSubobject<T>(), но с помощью этой единственной функции мы также можем создать экземпляр любого класса, унаследованного от UObject.

  • SpawnActor<T>(), используемого для создания экземпляра объекта AActor class.

  • CreateDefaultSubobject<T>(), но с помощью этой единственной функции мы также можем создать экземпляр любого класса, унаследованного от UObject.

Итак, первый вопрос: что такое разница, если мы можем использовать эти функции для одной цели? Как и когда и почему нам нужно использовать любой из них?

1 Ответ

1 голос
/ 02 февраля 2020

Чтобы понять разницу между этими функциями, вам нужно помнить, что объектная модель в 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, который обрабатывает фактическое создание объекта.

...