Announcement

Collapse
No announcement yet.

c++ equivalent of Add ChildActorComponent

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    c++ equivalent of Add ChildActorComponent

    Dear Community,

    I am trying to add child actor components to an actor upon its creation.
    I know i can do this in blueprints by using the Add ChildActorComponent node and specifying the Child Actor Class.

    Is there a way to do exactly this in c++? or is there a way to automate this (as in have a loop which would add ChildActorComponents of various classes depending on an Array of classes)

    Thanks in advance.
    My Works:
    Inventory and Equipment System | S.M.C (Simple Multiplayer Chat) | Spell/Ability System | Character Attribute Progression System

    Youtube | Website | Sellfy Page
    Fantasy 3rd-Person RPG , Skyland Of Arnythos

    #2
    I think what you're looking for is UChildActorComponent.

    https://docs.unrealengine.com/latest...ent/index.html

    On 4.6, it would be something along the lines of the following (typed in forum, never compiled, caveat emptor, no refunds, no guarantee):

    In .h:
    Code:
    UPROPERTY(VisibleDefaultsOnly)
    UChildActorComponent* ChildActor;
    In .cpp constructor:

    Code:
    ChildActor = ObjectInitializer.CreateDefaultSubobject<UChildActorComponent>(this, TEXT("InventoryCamera"));
    ChildActor->ChildActorClass = [Actor class to create]::StaticClass();
    ChildActor->CreateChildActor();
    You can find the API documentation and source for CreateChildActor() here: https://docs.unrealengine.com/latest...tor/index.html

    Comment


      #3
      I seem to be unable to create a child actor component in c++, ObjectInitializer can be only used in the constructor (i tried creating new objectinitializer outside of the constructor but it fails to create the component), and CreateChildActor throws a compile error with unresolved externals, i've also tried to create an actor by spawnActor but im unable to do so prior to start of the game.

      In blueprints i can use Add ChildActorComponent in the construction script but I have to manually specify the child actor class in the details panel (which isnt very efficient as I need to create quite few child actors based on a class array).
      My Works:
      Inventory and Equipment System | S.M.C (Simple Multiplayer Chat) | Spell/Ability System | Character Attribute Progression System

      Youtube | Website | Sellfy Page
      Fantasy 3rd-Person RPG , Skyland Of Arnythos

      Comment


        #4
        UChildActorComponent is a bit of a kludge meant to work around certain hierarchies that don't work well in Blueprint. Blueprints are meant to be created with a hierarchy of components, but in some rare cases you'll need to add another actor to that hierarchy, which is something that Blueprint does not handle well at all. In the simple cases, the best solution is to separate whatever actor you want to add into a component of its own (just like static mesh actor is merely a thin wrapper for static mesh component) which you can then create and handle without going through a child actor component.

        In any event, you can use Jeff's solution except for one change: remove the CreateChildActor call from the constructor. You cannot spawn new actors in constructors, only subobjects (which Actors cannot be).

        If you really want to keep the ChildActorComponent, a simple fix would be to keep those two lines intact:
        Code:
        ChildActor = ObjectInitializer.CreateDefaultSubobject<UChildActorComponent>(this, TEXT("InventoryCamera"));
        ChildActor->ChildActorClass = [Actor class to create]::StaticClass();
        You don't need to manually call CreateChildActor as it will be called for you when the component is created. In fact, trying to call anything on it will yield linker unresolved externals as it is not exported from the engine. (See the MinimalAPI tag in its class declaration.) For this reason, I don't believe ChildActorComponent is meant to be used in C++.

        It's worth pointing out that in C++, you don't really need a child actor component since you can much more easily create and manage actor hierarchies. For instance:
        Code:
        void AMyCharacter::PostInitializeComponents()
        {
        	Super::PostInitializeComponents();
        
        	FActorSpawnParameters SpawnParams;
        	SpawnParams.bNoCollisionFail = true;
        	AMyPickup* Pickup = GetWorld()->SpawnActor<AMyPickup>( PickupClass, SpawnParams );
        	AddPickup( Pickup );
        }
        This was lifted from our game almost as-is and it is how we spawn initial inventory contents. You can use actors spawned in this way just like you would use one spawned by a childactorcomponent.

        -Camille

        Comment


          #5
          You mention that new actors cannot be spawned in the constructor, yet using the add child component node in blueprints ConstructionScript does spawn a child actor of the specified class and i can get a refference to that actor (which is what im trying to do) prior to launching the game.
          My Works:
          Inventory and Equipment System | S.M.C (Simple Multiplayer Chat) | Spell/Ability System | Character Attribute Progression System

          Youtube | Website | Sellfy Page
          Fantasy 3rd-Person RPG , Skyland Of Arnythos

          Comment


            #6
            Thanks for this thread. I don't know if anyone is still reading or responding, but in case anyone is can you describe how to do the C++ equivalent of AddChildActorComponent in a way that works outside of an actor constructor but inside another actor's construction script?

            Thanks,
            -X

            Comment


              #7
              Originally posted by Sarr View Post
              You mention that new actors cannot be spawned in the constructor, yet using the add child component node in blueprints ConstructionScript does spawn a child actor of the specified class and i can get a refference to that actor (which is what im trying to do) prior to launching the game.
              Are you per chance mixing up constructor and ConstructionScript? Those two arent the same at all. They refer to different functions.

              This may be an old thread, but I also struggle with creating and attaching an Actor from inside the construction script.

              I have a C++ class (deriving from AActor) which provides a method, which is supposed to spawn actors at certain locations. This method is called from the construction script of the BP that derives from that C++ class.
              CreateDefaultSubobject does not work (probably for the reason stated above: it is not meant to be used for actors) and SpawnActor can not be called from ConstructionScripts so nothing happens.
              Simply calling CreateDefaultSubobject on ChildActorComponent does not work (probably because it needs to be registered?).

              But it was stated above that ChildActorComponent is not supposed to be used from C++. So I would like to know what the proper C++ approach would look like for creating and attaching actors to itself (an actor). Can anyone help me out with this? Must I define a component instead of an actor and follow this page?

              Comment


                #8
                Originally posted by rYuxq View Post
                Are you per chance mixing up constructor and ConstructionScript? Those two arent the same at all. They refer to different functions.

                This may be an old thread, but I also struggle with creating and attaching an Actor from inside the construction script.

                I have a C++ class (deriving from AActor) which provides a method, which is supposed to spawn actors at certain locations. This method is called from the construction script of the BP that derives from that C++ class.
                CreateDefaultSubobject does not work (probably for the reason stated above: it is not meant to be used for actors) and SpawnActor can not be called from ConstructionScripts so nothing happens.
                Simply calling CreateDefaultSubobject on ChildActorComponent does not work (probably because it needs to be registered?).

                But it was stated above that ChildActorComponent is not supposed to be used from C++. So I would like to know what the proper C++ approach would look like for creating and attaching actors to itself (an actor). Can anyone help me out with this? Must I define a component instead of an actor and follow this page?
                Yeah i was mixing up construction script and constructors at the time
                , btw in my case the actors i needed to spawn were representing my game systems (inventory, combat, quests etc..) and i remade them as components that i then spawn in c++, if i need to spawn an actor alone, i do it on begin play
                My Works:
                Inventory and Equipment System | S.M.C (Simple Multiplayer Chat) | Spell/Ability System | Character Attribute Progression System

                Youtube | Website | Sellfy Page
                Fantasy 3rd-Person RPG , Skyland Of Arnythos

                Comment


                  #9
                  Originally posted by Sarr View Post
                  btw in my case the actors i needed to spawn were representing my game systems (inventory, combat, quests etc..) and i remade them as components that i then spawn in c++, if i need to spawn an actor alone, i do it on begin play
                  Actually I realized a few minutes ago that CreateDefaultSubobject ist meant to be used inside the constructor only. Not inside the ConstructionScript. We are supposed to use NewObject and its alike when we want to dynamically spawn outside of the constructor:
                  https://docs.unrealengine.com/latest...ion/index.html

                  Edit: nvm I fixed this as well, this time I was too quick to ask
                  Last edited by rYuxq; 04-27-2016, 12:20 PM.

                  Comment


                    #10
                    My game systems are Actor Components and I spawn them like this in my main character system class

                    Inventory_System = PCIP.CreateDefaultSubobject<UInventorySystemClass>(this, "Inventory_System");
                    My Works:
                    Inventory and Equipment System | S.M.C (Simple Multiplayer Chat) | Spell/Ability System | Character Attribute Progression System

                    Youtube | Website | Sellfy Page
                    Fantasy 3rd-Person RPG , Skyland Of Arnythos

                    Comment


                      #11
                      Originally posted by Sarr View Post
                      You mention that new actors cannot be spawned in the constructor, yet using the add child component node in blueprints ConstructionScript does spawn a child actor of the specified class and i can get a refference to that actor (which is what im trying to do) prior to launching the game.
                      The ConstructionScript equivalent in C++ is the virtual method OnConstruction.
                      You can override that method and that's how you'll get the ConstructionScript functionallity in C++.

                      Comment


                        #12
                        Thanks guys, very useful!

                        Comment

                        Working...
                        X