Сетка Atached Actor не привязана к Parent Actor - PullRequest
1 голос
/ 09 марта 2019

Контекст:

Я создаю некоторых Актеров (Щиты), используя C ++ в ActorComponent (ShieldComponent), который присоединен к Актору (Корабль). Когда я перемещаю свой Корабль, Актеры (Щиты) остаются на месте в мире (не перемещаются вместе с Кораблем).

Что может быть важно: Я не называю CreateShieldActor в конструкторе, поэтому я не могу использовать ConstructorHelpers::FObjectFinder вместо StaticLoadObject/LoadObject для загрузки сетки / материала.

Мой код C ++ для создания выглядит следующим образом:

AShieldPart* UShieldComponent::CreateShieldActor(AActor* Owner, FString MeshName)
{
    //Create Shield Actor
    FVector Location = Owner->GetActorLocation();
    FRotator Rotator(0, 0, 0);
    FVector Scale(10, 10, 10);
    FActorSpawnParameters SpawnInfo;
    SpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
    SpawnInfo.Owner = Owner;

    FTransform Transform(Rotator, Location, Scale);
    UClass * MeshClass = AShieldPart::StaticClass();

    AShieldPart* ShieldPart = GetWorld()->SpawnActor<AShieldPart>(MeshClass, Transform, SpawnInfo);

    //Attach Mesh to Shield Actor
    ShieldPart->AttachToActor(Owner, FAttachmentTransformRules(EAttachmentRule::KeepRelative, false));

    //Set Mesh for Shield
    ShieldPart->SetNewMesh(MeshName);

    //Set Material
    UMaterial* Material = Cast<UMaterial>(StaticLoadObject(UMaterial::StaticClass(), NULL, TEXT("/some/path")));
    ShieldPart->MeshComponent->SetMaterial(0, Material);

    return ShieldPart;
}


AShieldPart::AShieldPart()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
    SetRootComponent(RootComponent);

    MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
    MeshComponent->SetupAttachment(RootComponent);
}

void AShieldPart::SetNewMesh(FString MeshName)
{
    UStaticMesh* Mesh = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(), NULL, *MeshName));
    //UStaticMesh* Mesh = LoadObject<UStaticMesh>(nullptr, *MeshName);
    MeshComponent->SetStaticMesh(Mesh);
    MeshComponent->SetCollisionProfileName(TEXT("BlockAll"));
    MeshComponent->SetNotifyRigidBodyCollision(true);
    MeshComponent->SetSimulatePhysics(true);
    MeshComponent->SetEnableGravity(false);

    MeshComponent->RegisterComponent();
}

Что было бы интереснее, когда я создаю, что Актеры (Щиты), использующие БП, все прекрасно работают ...

enter image description here

1 Ответ

1 голос
/ 10 марта 2019

Решение оказалось устранением USceneComponent как RootElement. Основной элемент должен быть UStaticMeshComponent, тогда он может быть прикреплен к родительскому элементу (Ship).

AShieldPart::AShieldPart()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    // Creating MeshComponent and attach to RootComponent
    MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
    RootComponent = MeshComponent;
    MeshComponent->AttachToComponent(RootComponent, FAttachmentTransformRules(EAttachmentRule::SnapToTarget, true));

    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...