【UE4 C++】Actor 与 Component —— 创建、销毁

66 篇文章 6 订阅

Actor的生成与销毁

创建Actor实例

  • UClass*

  • TSubclassOf<T>

  • SpawnActor()

    UPROPERTY(EditAnywhere, Category = "init")
    	UClass* bullet0; // 取类
    
    UPROPERTY(EditAnywhere, Category = "init")
    	TSubclassOf<Amissile> bullet; //取Amissile类及其派生类
    
    UPROPERTY(EditAnywhere, Category = "init")
    	Amissile* bullet2; // 取类的实例
    
    GetWorld()->SpawnActor<Amissile>(bullet0, GetActorTransform());
    
    GetWorld()->SpawnActor<Amissile>(bullet, body->GetSocketTransform("FirePos"));
    
    Amissile* MissileIns = GetWorld()->SpawnActor<Amissile>(bullet2->StaticClass(), GetActorTransform());
    

销毁

直接销毁

  • 使用Destroy()

    MissileIns->Destroy();
    

设置生命周期

  • 构造函数设置 InitialLifeSpan

    InitialLifeSpan = 8.0f;
    
  • BeginPlay 里使用 SetLifeSpan() 设置生命周期

    InitialLifeSpan = 8.0f;
    

Component 的创建与销毁

创建Component

构造函数创建

  • CreateDefaultSubobject<T>

    UPROPERTY(VisibleAnywhere)
    	UStaticMeshComponent* paddle1;
    
    paddle1 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("paddle1"));
    

Runtime 创建

  • NewObject<T>

  • RegisterComponent()

    Mesh = NewObject<UStaticMeshComponent>(this,TEXT("MyMesh"));
    Mesh->SetupAttachment(root);
    Mesh->RegisterComponent(); // 注册渲染/物理状态
    // 可配合 LoadObject() 
    

加载资源

FObjectFinder 构造函数加载资源

  • ConstructorHelpers::FObjectFinder<T>

    static ConstructorHelpers::FObjectFinder<UStaticMesh> paddleMesh(TEXT("StaticMesh'/Game/Demo_Drone/SM/paddle.paddle'"));
    if (paddleMesh.Succeeded())
    {
    	paddle1->SetStaticMesh(paddleMesh.Object);
    }
    

LoadObject 加载资源

  • LoadObject<T>

    UStaticMesh* bodyMesh = LoadObject<UStaticMesh>(this,TEXT("StaticMesh'/Game/Demo_Drone/SM/drone.drone'"));
    if (bodyMesh)
    {
    	body->SetStaticMesh(bodyMesh);
    }
    

设置组件层级关系

  • 设置根组件 RootComponent 或者 SetRootComponent()

  • SetupAttachment

  • AttachToComponent

    RootComponent = outCollison;
    SetRootComponent(outCollison);
    
    paddle1->SetupAttachment(body, TEXT("paddle1"));
    paddle2->SetupAttachment(body, TEXT("paddle2"));
    paddle3->AttachToComponent(body, FAttachmentTransformRules::KeepRelativeTransform, TEXT("paddle3"));
    paddle4->AttachToComponent(body, FAttachmentTransformRules::KeepRelativeTransform, TEXT("paddle4"));
    
    childSceneComponent->AttachToComponent(root, FAttachmentTransformRules::SnapToTargetIncludingScale);
    

销毁组件

  • DestroyComponent()

  • UnregisterComponent() 使用 RegisterComponent 创建,需要先注销再销毁

    Mesh->UnregisterComponent();
    Mesh->DestroyComponent();
    

各类组件创建与初始化

UStaticMeshComponent

paddle1 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("paddle1"));
auto paddleMesh = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Game/Demo_Drone/SM/paddle.paddle'"));
if (paddleMesh.Object != nullptr)
{
	paddle1->SetStaticMesh(paddleMesh.Object);
}

UBoxComponent

outCollison = CreateDefaultSubobject<UBoxComponent>(TEXT("outCollison"));
outCollison->SetBoxExtent(FVector(60, 60, 15));
outCollison->SetSimulatePhysics(true);
outCollison->SetCollisionProfileName(TEXT("WorldDynamic"));
outCollison->SetCollisionEnabled(ECollisionEnabled::NoCollision);

USphereComponent

sphereComp = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComp"));
sphereComp->InitSphereRadius(5.0f);
sphereComp->SetCollisionProfileName(TEXT("WorldDynamic"));
sphereComp->SetGenerateOverlapEvents(true);
sphereComp->OnComponentBeginOverlap.AddDynamic(this, &Amissile::Overlaphandler);
// overlap 函数绑定
void Amissile::Overlaphandler(UPrimitiveComponent* OverlappedComponent,
				AActor* OtherActor, 
				UPrimitiveComponent* OtherComp,
				int32 OtherBodyIndex,
				bool bFromSweep,
				const FHitResult& SweepResult){}

USkeletalMeshComponent

SkeletalMeshComp = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("SkeletalMeshComp"));
SkeletalMeshComp->SetGenerateOverlapEvents(true);
SkeletalMeshComp->SetSimulatePhysics(true);

USpringArmComponent 和 UCameraComponent

springArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
springArmComp->SetupAttachment(RootComponent);
cameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
cameraComp->SetupAttachment(springArmComp);

UPhysicsThrusterComponent

upThrusterComp = CreateDefaultSubobject<UPhysicsThrusterComponent>(TEXT("upThrusterComp"));
upThrusterComp->SetupAttachment(RootComponent);
upThrusterComp->SetWorldRotation(UKismetMathLibrary::MakeRotFromX(FVector(-this->GetActorUpVector())));
upThrusterComp->ThrustStrength = 980.0f;
upThrusterComp->SetAutoActivate(true);

UTextRenderComponent

CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));
CountdownText->SetHorizontalAlignment(EHTA_Center);
CountdownText->SetWorldSize(150.0f);
CountdownText->AttachTo(RootComponent);
CountdownTime = 3;
CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));
projectileMovementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("projectileMovement"));
projectileMovementComp->InitialSpeed = 500.0f;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值