[UE5] Cast와 CastChecked에 대해

ChangJin·2024년 11월 10일
0

Unreal Engine5

목록 보기
109/114
post-thumbnail

Unreal Engine 5의 Cast<>CastChecked<>는 두 가지 주요 캐스팅 함수입니다. 둘 다 특정 타입으로 안전하게 형변환하는데, 사용 목적과 동작 방식이 다릅니다. 각각의 특성과 예제 코드들을 살펴보겠습니다.

1. Cast<>

Cast<>는 안전한 형변환을 수행하는 함수로, 캐스팅이 성공하면 변환된 객체를 반환하고, 실패하면 nullptr을 반환합니다. 이는 캐스팅의 성공 여부를 체크해야 하는 상황에서 주로 사용됩니다.

  • 용도: 캐스팅이 실패할 가능성이 있는 경우, 안전하게 실패를 처리하고 싶을 때.
  • 장점: 캐스팅이 실패해도 nullptr을 반환하므로 프로그램이 크래시 되지 않음.

예제 코드

AActor* MyActor = GetSomeActor();
AMyCharacter* MyCharacter = Cast<AMyCharacter>(MyActor);

if (MyCharacter)
{
    // 캐스팅 성공: MyCharacter로 작업을 수행합니다.
    MyCharacter->DoSomething();
}
else
{
    // 캐스팅 실패: 다른 처리 로직을 수행하거나 무시합니다.
    UE_LOG(LogTemp, Warning, TEXT("캐스팅 실패"));
}

위 코드에서는 Cast<>를 통해 MyActorAMyCharacter 타입으로 변환을 시도하며, 캐스팅이 실패할 경우 nullptr이 반환되므로 안전하게 확인할 수 있습니다.

2. CastChecked<>

CastChecked<>는 캐스팅 실패 시 예외가 발생하도록 하여, 실패할 가능성이 낮거나 실패 시 즉시 프로그램을 종료해야 하는 경우에 적합합니다. 실패하면 checkf()를 호출하여 디버그 모드에서는 디버깅 창에서 경고를 확인할 수 있습니다.

  • 용도: 캐스팅이 반드시 성공해야 하며, 실패 시 예외를 발생시켜야 할 때.
  • 장점: 코드가 더 강력하게 검사되며, 캐스팅 실패 시 명확하게 오류가 발생함.

예제 코드

AActor* MyActor = GetSomeActor();
AMyCharacter* MyCharacter = CastChecked<AMyCharacter>(MyActor);

// 반드시 성공하는 캐스팅이므로 이후 코드에서 MyCharacter를 안전하게 사용할 수 있습니다.
MyCharacter->DoSomething();

CastChecked<>는 반드시 성공해야 하는 캐스팅 상황에 적합하며, 디버깅 중에는 캐스팅 실패 시 오류 메시지를 확인할 수 있습니다. Cast<>와 달리 실패 시 nullptr을 반환하지 않고 즉시 예외를 던지므로 오류 원인을 빠르게 확인할 수 있습니다.

요약 비교

특성Cast<>CastChecked<>
반환 값성공 시 타입 변환, 실패 시 nullptr성공 시 타입 변환, 실패 시 예외 발생
실패 시 안전성nullptr 반환, 안전하게 체크 가능실패 시 프로그램이 종료됨
사용 용도실패 가능성이 있거나 예외 처리가 필요할 때실패 가능성이 거의 없고, 반드시 성공해야 할 때

상황별 사용 예시

  1. Cast<> 사용 예시

    • 게임에서 특정 객체가 원하는 타입인지 확인해야 할 때, 예를 들어 아이템을 집어올 때 Cast<>를 사용하여 확인 후 아이템으로 변환합니다.
    AActor* HitActor = LineTrace(); // 라인트레이스로 얻은 객체
    APickupItem* Pickup = Cast<APickupItem>(HitActor);
    
    if (Pickup)
    {
        Pickup->Collect();
    }
    else
    {
        UE_LOG(LogTemp, Warning, TEXT("이 객체는 아이템이 아닙니다."));
    }
  2. CastChecked<> 사용 예시

    • 반드시 성공해야 하는 상황, 예를 들어 플레이어 캐릭터를 처리하는 로직에서는 CastChecked<>를 사용하여 강력한 타입 확인을 할 수 있습니다.
    AActor* PlayerActor = GetWorld()->GetFirstPlayerController()->GetPawn();
    AMyPlayerCharacter* PlayerCharacter = CastChecked<AMyPlayerCharacter>(PlayerActor);
    
    // 반드시 성공해야 하므로 PlayerCharacter로 바로 접근 가능합니다.
    PlayerCharacter->StartMission();
profile
게임 프로그래머

0개의 댓글