언리얼 엔진에서 Spawing을 지연시키는 방법이 2가지가 있다. 첫번째로, 처음부터 SpawningActorDeferred를 사용하는 방법이 있다. 두번째로, SpawnActor를 사용하되 bDeferConstruciton = true 설정을 하여 스폰 지연시키는 방법이 있다.

 

목차

     

     


     

     

    Spawning을 지연시키는 방법


     

    문제 상황

     

    SpawnActor를 하는 시점을 지연 시키고 싶다.

     

    이유 예)

    • 데이터가 다 세팅되지 않았다.
    • SpawnActor가 끝나기 전에 체크하고 싶은게 있다.

     

     

    Spawning을 지연시키는 2가지 방법

     

    1. SpawningActorDeferred를 사용

     

    2. SpawnActor를 사용하되 bDeferConstruciton = true 설정을 하여 스폰 지연시키기 

    • 아래 내용 참고.

     

     

    SpawnActor를 사용하되 bDeferConstruciton = true 설정을 하여 스폰 지연시키기 

     

     

    FActorSpawnParameters 내에 bDeferConstrucitontrue로 설정해준다. 

     

    FActorSpawnParameters 을 인자로 SpawnActor로 액터를 스폰시킨다. 이 때는 아직 스폰이 끝나지 않은 상태다.

     

    스폰을 끝내기 원하는 시점에  FinishSpawning을 불러 스폰을 끝내준다.

     

     

    아래의 코드는 GameModeBase 클래스에 구현된 SpawnPlayerConstroller 함수다. 아래에서 위에서 설명한 방법이 사용되었다.

    virtual APlayerController* SpawnPlayerController(ENetRole InRemoteRole, const FString& Options)
    {
        FActorSpawnParameters SpawnInfo;
        SpawnInfo.Instigator = GetInstigator();
    
        SpawnInfo.bDeferConstruction = true; // 이걸 true로 설정!
    
        // we never want to save player controllers into a map
        SpawnInfo.ObjectFlags |= RF_Transient;
    
        APlayerController* NewPC = GetWorld()->SpawnActor<APlayerController>(PlayerControllerClass, FVector::ZeroVector, FRotator::ZeroRotator, SpawnInfo);
    
        if (NewPC)
        {
            if (InRemoteRole == ROLE_SimulatedProxy)
            {
                // this is a local player because it has no authority/autonomous remote role
                NewPC->SetAsLocalPlayerController();
            }
    
            NewPC->FinishSpawning(FTransform(FVector::ZeroVector, FRotator::ZeroRotator), false, nullptr, ESpawnActorScaleMethod::MultiplyWithRoot); // 스폰 끝내기!
        }
    
        return NewPC;
    }