어쩌면 언리얼 C++정복 초반에 써야됐었는데 늦게 쓰게 되었다.
Cast 는 다른 컴포넌트나 다른 클래스(액터,오브젝트,허드,게임모드) 등등 주로 타 클래스의 변수에 접근할때 주로 사용하는데,
언리얼엔진의 다양한 클래스는 (액터나,컨트롤러) 서로 유기적으로 연결되어 있는데, 예를 들어 내 캐릭터가 적에게 총을 쏘고 그 맞은 상대방에게 데미지를 입힐려면 UInterface와 같은 클래스를 적용하여 데미지를 입힐 수 있는데, 즉 적 엑터를 찾고 그 엑터의 컴포넌트나 변수에 접근을 해야한다. 하지만 대게 오브젝트를 찾는 함수들은 최상위 타입인 UObject 나 AActor 으로만 반환한다.
예를 들어 AActor* Actor = GetHitResult().GetActor();
여기서 가져온 HitActor 는 AActor 타입이고 내가 가져오고 싶은 변수나 함수는 자신의 캐릭터에 붙어있는 클래스일것이다.
그래서 만약 자신의 캐릭터에 AMyCharacter.h안에 있는 변수를 불러오고 싶을때 HitActor->Health 를 하면 당연히 컴파일이 에러가 뜬다. 적을 맞추고 체력을 변경할려면 AMyCharacter.h 에 있는 Health 변수의 값을 수정하고 싶은거지 AActor에는 AMyCharacter가 없기 때문이다.
Cast는 이 오브젝트가 내가 원하는 클래스 타입이 맞는지 확인하고, 그 타입이 맞으면 변환 해주는 언리얼 엔진의 템플릿 함수이다.
C++에 static_cast나 dynamic_cast 와 비슷한데, 언리얼은 UObject 기반의 클래스에서만 사용가능하다.
예를 들어 방금전의 AActor* Actor = GetHitResult().GetActor(); 이 코드를 수정해본다면,
AMyCharacter* HitActor = Cast<AMyCharacter>(HitActor);
if(HitActor) HitActor->Health -= 10; 이런식으로 작성을 하게 되면 된다.
항상 if문으로 체크하자..
static_cast와는 뭐가 다를까?
static_Cast는 컴파일 타임에만 체크하고, Cast<>는 런타임에 언리얼 타임 시스템까지 체크 , 언리얼의 가비지 컬렉션, 리플렉션 시스템과 맞물려 동작한다.
성능도 매우 가벼워서 틱에서 반복적으로 호출하는게 아닌이상 문제 발생 가능성이 있다.
만약 틱펑션에서 호출을 자주할거 같으면
AHUD= AHUD == nullptr ? Cast<AAHUD>(GetHUD()) : AHUD ; 이런식으로 불러와주면 최적화가 가능하다.
과거 유니티를 개발할때는 Cast를 사용하지 않고 주로 [SerializeField]로 public으로 컴포넌트를 붙여서 인스펙트에서 직접 할당하는 경우가 많았는데 언리얼은 UPROPERTY로 가능하긴한데 다른 클래스를 붙일 수는 없다
'언리얼 엔진 5' 카테고리의 다른 글
| 언리얼엔진5 C++로 정복하기(18) UPROPERTY, UFUNCTION 매크로/GC 정리 (0) | 2026.01.23 |
|---|---|
| 언리얼엔진5 C++로 정복하기(17) 서버 RPC 완벽 정리 (7) | 2025.08.01 |
| 언리얼엔진5 C++로 정복하기(15) 변수 동기화와 GetLifetimeReplicatedProps 이해하기 (0) | 2025.07.21 |
| 언리얼엔진5 C++로 정복하기(14) PlayerState 복제 타이밍 & 클라이언트 HUD 업데이트 (2) | 2025.07.18 |
| 언리얼엔진5 C++로 정복하기(13) FVector_NetQuantize 가 뭘까? (0) | 2025.07.04 |