web-dev-qa-db-fra.com

Unreal Moteur 4. Différentes façons d'instancier l'objet

J'ai trouvé environ quatre manières différentes d'instancier l'objet, mais je ne sais pas si ma compréhension est claire.

  • NewObject<T>() Fonction utilisée lorsque nous voulons faire à l'instance de UOBJECT. Par exemple, il peut s'agir de tous les acteurs.

    USomeComponent sc = NewObject<USomeComponent> (class);

  • ConstructObject<T>() un moyen de plus d'init uObject ...

  • CreateDefaultSubobject<T>() Mais en utilisant cette fonction One, nous pouvons également créer une instance de n'importe quelle classe héritée de UObject.

  • SpawnActor<T>() Utilisé pour instantifier un objet de AActor classe.

Donc, première question: quelle est la différence si nous pouvons utiliser ces fonctions à un seul but? Comment et quand et pourquoi nous devons utiliser l'un d'entre eux?

7
raviga

Pour comprendre la différence entre ces fonctions, vous devez vous rappeler que le modèle d'objet dans Unreal Engine est basé sur des prototypes d'objets, tout comme dans JavaScript. Chaque UCLASS est associée à une instance par défaut de la classe UObject associée, appelée l'objet par défaut de la classe (CDO), qui est attribué d'abord, puis construit, uniquement ne fois, via le constructeur de classe lorsque le moteur est initialisé. . Le CDO agit comme un modèle à partir de laquelle toutes les autres instances de la classe sont copiées et que le constructeur n'est jamais appelé.

Cela signifie que les constructeurs de classe ne peuvent contenir aucune logique d'exécution et ne doivent être utilisés que pour initialiser le CDO et ses propriétés. Si la classe contient des sous-observations, telles que les composants de l'acteur, ceux-ci doivent faire la même chose, de sorte que leurs propres objets par défaut doivent être construits en premier. L'instanciation réelle de l'objet doit ensuite être différée, une fois que le moteur a été initialisé, de sorte que chaque fois qu'une nouvelle instance de la classe soit demandée à créer par code de gameplay normal, l'objet parent et tous ses sous-observations sont instanciés de leur respectif. Par défaut.

Ainsi, les multiples façons de créer des objets sont nécessaires pour gérer tous les différents scénarios où un objet peut être créé.

  • UObject::CreateDefaultSubobject est seulement appelable dans un constructeur de classe et prend soin de créer une instance de la CDO de la classe de SubObject, définissant sa classe externe en tant qu'objet de l'appelant, entre autres choses. L'objet créé devient alors l'objet par défaut de la propriété lorsque sa classe d'objets est instanciée.

  • NewObject<T> La fonction est normalement utilisée pour instancier des objets après l'initialisation du moteur, lors du gameplay normal. Il fournit plusieurs surcharges de commodité pour gérer la plupart des scénarios.

  • UWorld::SpawnActor<T> est une méthode de commodité pour engager des acteurs d'un niveau avec l'emplacement et la rotation spécifiés, les paramètres de collision de ponte et les vérifications pour s'assurer que c'est une classe d'acteur spawnable et n'est rien de plus qu'un wrapper de NewObject<AActor>.

  • ConstructObject a été supprimé en faveur de NewObject.

Je recommande de vérifier le code source du moteur pour plus d'informations, notamment UObject/uObjectGlobal.cpp et uObject/uObjectGlobal.h dans le module de moteur CoreuObject. Interne, toutes ces fonctions appellent finalement (à partir de 4.24) StaticConstructObject_Internal, qui gère la création d'objets réelle.

3
Rei