스파르타 코딩클럽 내 프로젝트를 진행하며 액터를 스폰시키는 프로젝트가 있었습니다.

프로젝트를 진행하며 런타임 환경 내 액터를 스폰시키기위해 SpawnActor함수를 호출하며 동시에 추상클래스를 기반으로 확장성있는 액터 구조를 설계하였지만, 공통 프로퍼티를 설정하던 중 SpawnActor를 사용할 경우 BeginPlay가 바로 호출되어 추가로 설정할 수 없던 문제가 있었습니다.

해당 경우를 해결하기위해 SpawnActorDeferred를 사용하게 되었으며, 이를 계기로 기존의 SpawnActor와의 차이점 및 특징에 대해 알아보겠습니다.

 

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.

 

+ Recent posts