1.銷毀Actor
? ? ? ? 1.Actor中存在Destory()函數和Destoryed()函數
? ? ? ? Destory()函數是成員函數,它會立即標記 Actor
為銷毀狀態,并且會從場景中移除該 Actor
。它會觸發生命周期中的銷毀過程,調用 Destroy()
后,Actor
立即進入銷毀過程。具體來說,它會開始執行 BeginDestroy()
和 EndDestroy()
,并且會銷毀 Actor
本身及其所有組件
? ? ? ? Destroyed()函數是虛函數(或者是事件函數),它在 Actor
被銷毀后被自動調用。你可以在 Destroyed()
中執行一些銷毀后的清理工作,Destroyed()
是一個回調函數,當 Actor
銷毀過程完成時(通常是調用 Destroy()
后)會被自動調用。可以重寫Destoryed()函數完成Actor銷毀后的一些操作
? ? ? ? 2.Actor在什么時候會被完全銷毀
? ? ? ? 1.調用 Destroy()
時,Unreal Engine 不會立即釋放 Actor
的內存,而是:
- 標記
Actor
為待銷毀狀態 (bPendingKill = true
)。 - 移除
Actor
及其組件,停止它的 Tick 和物理模擬。 - 觸發
EndPlay()
事件(如果Actor
還在BeginPlay()
之后)。 - 觸發
Destroyed()
事件,讓子類可以在銷毀前執行額外邏輯。 Actor
從世界中移除,停止 Tick 和物理模擬
? ? ? ? ?2.調用Destroyed()
- 允許
Actor
在銷毀前執行自定義邏輯
? ? ? ? 3.UE中的GC機制
? ? ? ? 當前階段會釋放掉Actor的內存。
2.移動Actor
? ? ? ? 1.使用MoveComponent()函數,
void ASpawnActor::SetActorLocation()
{UStaticMeshComponent* RootComp = Cast<UStaticMeshComponent>(GetRootComponent());if (RootComp){// 定義你想要移動的偏移量FVector Offset(0.f, 0.f, -10.f); // 向Z軸移動10單位// 使用MoveComponent來平滑移動組件RootComp->MoveComponent(Offset, FRotator::ZeroRotator, true);//UE_LOG(LogTemp, Warning, TEXT("move ment component"));}
}
????????我當前的RootComponent是UStaticMeshComponent類型的,如果使用SetupAttachment附加到原本的RootComponent也可以實現,MoveCompoennt是USceneComponent類中的成員函數,只要繼承自這個類都可以調用MoveCompoennt函數
? ? ? ? 2.創建一個UMoveMentComponent的組件
? ? ? ? 創建C++類ActorMovementComponent繼承自MoveMentComponent,在,Actor中定義指針,在Actor的構造中初始化這個指針
UPROPERTY(VisibleAnywhere, Category = "Move");
UActorMovementComponent* ActorMovementComponent;ActorMovementComponent = CreateDefaultSubobject<UActorMovementComponent>(TEXT("Move"));
ActorMovementComponent類中實現(TickComponent是虛函數,重寫一份,記得)
void UActorMovementComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{//一定記得要寫這行Super::TickComponent(DeltaTime, TickType, ThisTickFunction);// 速度和加速度可以從Actor 中設置,也可以默認// 更新速度,應用加速度FVelocity += Acceleration * DeltaTime;// 限制最大速度if (FVelocity.Size() > MaxSpeed){FVelocity = FVelocity.GetSafeNormal() * MaxSpeed;}// 更新 Actor 位置FVector NewLocation = GetOwner()->GetActorLocation() + (FVelocity * DeltaTime);GetOwner()->SetActorLocation(NewLocation);// 重置加速度(如果希望每幀都控制加速度,可以在外部控制)Acceleration = FVector::ZeroVector;
}
3.制作一個簡單的空氣墻
? ? ? ? 1.創建一個UBoxComponent設置SetVisibility(false)將可視性為變成false,設置碰撞類型
SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
SetCollisionResponseToAllChannels(ECR_Block); // 使得所有物體都會被阻擋
SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera,ECollisionResponse::ECR_Ignore);
? ? ? ? 2.創建對應藍圖,拖拽到場景中,調整大小。