# Actor的生成與銷毀
## 創建Actor實例
- `UClass*`
- `TSubclassOf<T>`
- `SpawnActor()`
```cpp
UPROPERTY(EditAnywhere, Category = "init")
UClass* bullet0; // 取類
UPROPERTY(EditAnywhere, Category = "init")
TSubclassOf<Amissile> bullet; //取Amissile類及其派生類
UPROPERTY(EditAnywhere, Category = "init")
Amissile* bullet2; // 取類的實例
```
```cpp
GetWorld()->SpawnActor<Amissile>(bullet0, GetActorTransform());
GetWorld()->SpawnActor<Amissile>(bullet, body->GetSocketTransform("FirePos"));
Amissile* MissileIns = GetWorld()->SpawnActor<Amissile>(bullet2->StaticClass(), GetActorTransform());
```
## 銷毀
### 直接銷毀
- 使用Destroy()
```cpp
MissileIns->Destroy();
```
### 設置生命周期
- 構造函數設置 `InitialLifeSpan`
```cpp
InitialLifeSpan = 8.0f;
```
- BeginPlay 里使用 `SetLifeSpan()` 設置生命周期
```cpp
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;