본문 바로가기
프로그래밍

👨‍💻 [Unreal] 언리얼 엔진에서 SpawnActor 와 SpawnActorDeferred 는 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2024. 12. 27.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

언리얼 엔진에서 SpawnActor 와 SpawnActorDeferred 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

언리얼 엔진에서 SpawnActor 와 SpawnActorDeferred 는 무엇이며, 어떻게 활용할 수 있나요?

답변 >

언리얼 엔진에서 SpawnActorSpawnActorDeferred는 런타임에 액터를 생성하기 위한 함수입니다. 두 함수 모두 UWorld 클래스의 멤버이며, 액터를 동적으로 생성할 때 사용됩니다. 이 둘의 주요 차이점은 액터 초기화 시점세부적인 제어 가능성에 있습니다.


1. SpawnActor

SpawnActor는 액터를 즉시 생성 및 초기화하는 함수입니다. 생성과 동시에 모든 초기화 및 구성 작업이 완료됩니다.

구문

AActor* SpawnActor<T>(
    UClass* Class,
    const FTransform& Transform,
    const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters()
);

특징

  1. 즉시 초기화:
    • 액터가 생성된 직후 생성자(Constructor)BeginPlay가 호출됩니다.
  2. 간편성:
    • 기본적인 액터 생성에 적합.
  3. 제한된 커스터마이징:
    • 생성 후 추가적인 데이터 초기화가 필요할 경우 불편.

2. SpawnActorDeferred

SpawnActorDeferred는 액터를 지연 생성하는 함수입니다. 액터의 초기화 및 BeginPlay 호출을 연기하며, 생성 후 추가적인 초기화 작업을 수행할 수 있습니다.

구문

AActor* SpawnActorDeferred<T>(
    UClass* Class,
    const FTransform& Transform,
    AActor* Owner = nullptr,
    APawn* Instigator = nullptr,
    ESpawnActorCollisionHandlingMethod CollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn
);

특징

  1. 초기화 지연:
    • 생성자의 기본 초기화만 수행되며, BeginPlay는 호출되지 않음.
  2. 추가 초기화 가능:
    • 생성된 액터에 필요한 추가 데이터를 설정 가능.
  3. 최종화 필요:
    • 초기화 완료 후 FinishSpawningActor를 호출하여 액터를 최종화.

3. SpawnActor와 SpawnActorDeferred의 차이

특성  SpawnActor  SpawnActorDeferred
초기화 시점 생성 즉시 초기화 생성 후 수동으로 초기화
BeginPlay 호출 시점 즉시 호출 FinishSpawningActor 호출 시 호출
사용 용도 간단한 액터 생성 세부적인 초기화가 필요한 액터 생성
사용 예 일반적인 발사체, 아이템, 적 스폰 초기값이 필요한 액터, 복잡한 스폰 로직

4. SpawnActorDeferred 사용 방법

예제: 초기화 데이터를 설정해야 하는 액터 스폰

1) 액터 클래스 정의

UCLASS()
class MYGAME_API AMyActor : public AActor
{
    GENERATED_BODY()

public:
    void InitializeData(int32 InitialValue);

private:
    int32 Data;
};

2) 초기화 함수 구현

void AMyActor::InitializeData(int32 InitialValue)
{
    Data = InitialValue;
}

3) 액터 생성 및 초기화

void AMySpawner::SpawnCustomActor()
{
    if (MyActorClass)
    {
        FVector SpawnLocation(100.0f, 100.0f, 50.0f);
        FRotator SpawnRotation(0.0f, 0.0f, 0.0f);

        // 액터 생성 (지연 초기화)
        AMyActor* SpawnedActor = GetWorld()->SpawnActorDeferred<AMyActor>(
            MyActorClass,
            FTransform(SpawnRotation, SpawnLocation),
            this,
            nullptr,
            ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn
        );

        if (SpawnedActor)
        {
            // 추가 초기화 작업 수행
            SpawnedActor->InitializeData(42);

            // 생성 완료 및 BeginPlay 호출
            UGameplayStatics::FinishSpawningActor(SpawnedActor, FTransform(SpawnRotation, SpawnLocation));
        }
    }
}


5. 활용 사례

SpawnActor 활용 예

간단한 발사체 생성

  • 초기화가 복잡하지 않은 발사체, 아이템 등.
void AMyCharacter::Fire()
{
    FVector MuzzleLocation = GetActorLocation();
    FRotator MuzzleRotation = GetActorRotation();

    AMyProjectile* Projectile = GetWorld()->SpawnActor<AMyProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation);
}


SpawnActorDeferred 활용 예

상태를 가진 적 생성

  • 적이 특정 상태나 데이터를 가진 채로 스폰되어야 하는 경우.
void AEnemySpawner::SpawnEnemyWithState()
{
    FVector SpawnLocation = GetActorLocation();
    FRotator SpawnRotation = GetActorRotation();

    AEnemy* SpawnedEnemy = GetWorld()->SpawnActorDeferred<AEnemy>(
        EnemyClass,
        FTransform(SpawnRotation, SpawnLocation)
    );

    if (SpawnedEnemy)
    {
        // 초기 상태 설정
        SpawnedEnemy->SetEnemyType(EEnemyType::Boss);
        SpawnedEnemy->SetHealth(500);

        // 생성 완료
        UGameplayStatics::FinishSpawningActor(SpawnedEnemy, FTransform(SpawnRotation, SpawnLocation));
    }
}


6. 주의사항

  1. FinishSpawningActor 호출 누락 방지:
    • SpawnActorDeferred로 생성된 액터는 반드시 FinishSpawningActor를 호출해야 게임 월드에 추가되고 BeginPlay가 호출됩니다.
  2. 콜리전 처리:
    • 스폰 위치의 충돌 처리 방식(예: AlwaysSpawn, AdjustIfPossible)을 명확히 설정.
  3. 클래스 유효성 검사:
    • SpawnActor와 SpawnActorDeferred는 스폰할 클래스가 nullptr이면 충돌하거나 실패할 수 있으므로 사전 확인 필요.

7. 요약

  • SpawnActor: 즉시 초기화가 필요한 간단한 액터 생성에 사용.
  • SpawnActorDeferred: 초기화 작업이 필요한 복잡한 액터 생성에 사용.
  • 필요에 따라 두 함수를 적절히 활용하여 게임플레이의 동적 요소를 유연하게 구현할 수 있습니다.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형