Unreal Engine: как я могу создать UStaticMeshComponent в цикле? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать несколько UStaticMeshComponent с помощью цикла for, но Unreal Engine продолжает вызывать точку останова на CreateDefaultSubobject в Object.h (не в моем коде, это из основного API UE4). Когда я создаю один компонент, он работает нормально. Я довольно новичок в UnrealEngine и C ++, поэтому, возможно, я делаю что-то глупое, но, пожалуйста, будьте осторожны с этим :)

Большое спасибо за вашу помощь.

Заголовок

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FlowSphere.generated.h"

UCLASS()
class CPP_PRACTICE_3_API AFlowSphere : public AActor
{
    GENERATED_BODY()

public: 
    // Sets default values for this actor's properties
    AFlowSphere();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public: 
    // Called every frame
    virtual void Tick(float DeltaTime) override;

private:
    //UPROPERTY()
    //TArray<UStaticMeshComponent*> StaticMeshComponents;

    UStaticMeshComponent* test;

};

C ++

#include "FlowSphere.h"

// Sets default values
AFlowSphere::AFlowSphere()
{
    int32 amount = 100;

    RootComponent = CreateDefaultSubobject<USceneComponent>("SceneComponent");

    for (int32 i = 0; i < amount; i++) {

        //WHEN I INCLUDE THE LINE BELOW, UE4 START MAKING BREAKPOINT
        UStaticMeshComponent* item = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Sphere"));
        item.AttachTo(this->RootComponent);

    }

    //THIS WORKS FINE
    this->test = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("HELLO")); 
    PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AFlowSphere::BeginPlay()
{
    Super::BeginPlay();

}

// Called every frame
void AFlowSphere::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}

Где это вызывает точку останова на Object.h от UE4 API

    /**
    * Create a component or subobject
    * @param    TReturnType                 class of return type, all overrides must be of this type
    * @param    SubobjectName               name of the new component
    * @param    bTransient                  true if the component is being assigned to a transient property. This does not make the component itself transient, but does stop it from inheriting parent defaults
    */
    template<class TReturnType>
    TReturnType* CreateDefaultSubobject(FName SubobjectName, bool bTransient = false)
    {
        UClass* ReturnType = TReturnType::StaticClass();
        return static_cast<TReturnType*>(CreateDefaultSubobject(SubobjectName, ReturnType, ReturnType, /*bIsRequired =*/ true, /*bIsAbstract =*/ false, bTransient));
    }

1 Ответ

0 голосов
/ 14 марта 2019

Вы использовали одно и то же имя для двух разных вызовов CreateDefaultSubobject.

Я запустил ваш код в новом проекте UE4 C ++ и получил следующее сообщение об ошибке:

Неустранимая ошибка:[Файл: D: \ Build ++ UE4 \ Sync \ Engine \ Source \ Runtime \ CoreUObject \ Private \ UObject \ UObjectGlobals.cpp] [Строка: 3755] Субобъект по умолчанию StaticMeshComponent Sphere уже существует для FlowSphere /Script/MyProject.Default__FlowSphere.

Кроме того, отправленный вами код не компилировался.

item.AttachTo(this->RootComponent);

должен был быть:

item->AttachTo(this->RootComponent);

, и вам также нужно было включить "Компоненты /StaticMeshComponent.h».Вот исправленный код:

#include "FlowSphere.h"
#include "Components/StaticMeshComponent.h"

// Sets default values
AFlowSphere::AFlowSphere()
{
    int32 amount = 100;

    RootComponent = CreateDefaultSubobject<USceneComponent>("SceneComponent");

    for (int32 i = 0; i < amount; i++) {

        FName name = *FString::Printf(TEXT("Sphere %i"), i);
        UStaticMeshComponent* item = CreateDefaultSubobject<UStaticMeshComponent>(name);
        item->AttachTo(this->RootComponent);

    }

    this->test = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("HELLO"));
    PrimaryActorTick.bCanEverTick = true;

}
...