Unreal Engine/개념정리
[UE5] SpawnActorDeferred (지연된 스폰)
KimGeon-U
2025. 2. 3. 13:24
스파르타 코딩클럽 내 프로젝트를 진행하며 액터를 스폰시키는 프로젝트가 있었습니다.
프로젝트를 진행하며 런타임 환경 내 액터를 스폰시키기위해 SpawnActor함수를 호출하며 동시에 추상클래스를 기반으로 확장성있는 액터 구조를 설계하였지만, 공통 프로퍼티를 설정하던 중 SpawnActor를 사용할 경우 BeginPlay가 바로 호출되어 추가로 설정할 수 없던 문제가 있었습니다.
해당 경우를 해결하기위해 SpawnActorDeferred를 사용하게 되었으며, 이를 계기로 기존의 SpawnActor와의 차이점 및 특징에 대해 알아보겠습니다.
SpawnActorDeferred<T>
- 기존의 SpawnActor은 액터가 생성되며, 즉시 BeginPlay()가 실행된다.
- 생성된 액터에 추가적인 설정을 적용하며, FinishSpawning()을 호출하여 액터를 생성 할 수 있다.
- 생성하는 액터에 대해 컴포넌트 및 프로퍼티들을 추가/변경이 가능하다.
- Spawn시킨 후, 작업(추가적인 설정) 진행 후 FinishSpawning()을 사용한 BeginPlay()를 실행하는 구조.
- Parameters
- UClass* class : 생성할 액터 클래스
- FTransform const& Transform : 액터의 초기 위치 및 회전 값
- AActor* Owner = nullptr : 생성된 액터의 소유자(Owner)
- APawn* Instigator : 생성된 액터의 행위자(Ex) 공격을 가한 Pawn)
- ESpawnActorCollisionHandlingMethod CollisionHandlingOverride : 충돌 시 스폰 방식 설정
- AlwaysSpawn : 충돌 여부와 상관없이 무조건 스폰
- AdjustIfPossibleButAlwaysSpawn : 충돌 위치를 조정하고 무조건 스폰
- AdjustIfPossibleButDon'tSpawnIfColliding : 충돌된 위치를 조정, 그래도 충돌시 스폰하지 않는다.
- DontSpawnIfColliding : 충돌하는 경우 스폰하지 않는다.
예시코드
void AMoveActorSpawner::SpawnActorSettingWithRand(TSubclassOf<AMoveActorBase>& SpawnData)
{
AMoveActorBase* SpawnActor = GetWorld()->SpawnActorDeferred<AMoveActorBase>(SpawnData, FTransform(FRotator::ZeroRotator, FVector::ZeroVector), this, nullptr,
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn);
if (SpawnActor)
{
// ..액터 생성 전에 확인하고 싶은 로직
// .. 추가 설정하고 싶은 로직
SpawnActor->FinishSpawning(FTransform(FRotator::ZeroRotator, FVector::ZeroVector));
}
}
FActorSpawnParameters
- SpawnActorDeferred/SpawnActor에서 스폰 관련 옵션을 설정 할 수 있는 구조체
- SpawnActor를 사용하여 지연시 Timer 또는 FActorSpawnParameters 내 bDeferConstruction = true 방식을 통해 스폰을 지연 시킬 수 있다.
- SpawnActor + bDeferConstruction = true가 SpawnActorDeferred.