본문 바로가기
Unreal

[Unreal] 다른 클래스 Cast 하기

by imagineer_jinny 2023. 3. 13.

문제점

AnimInstance 클래스에서 DraculaCrossBow 오브젝트를 가져오고 싶은데 가져와지지 않음

 

 

원인

[의심 1] TryGetPawnOwner

 

TryGetPawnOwner 함수 이름 자체 Try. 

그래서 100% 가져온다는 확신이 없기 때문에 null체크를 하는 것임.

안된다는 것은 실패했다는 것이다.

 

기본적으로 배치될 수 있는 모든 것들은 Actor로 부터 상속을 받고

Actor -> Pawn -> Charactor 순으로 상속 받는다. 

 

여기서는 

Actor -> Pawn -> Charactor -> R1Pawn이 될 것이다. 

 

 

 

내 코드를 보면 crossBowObject는 Pawn이 아니기 때문에 TryGetPawnOwner로 가져오면 안된다는 것을 예상할 수 있음

 

 

해결 과정

crossBowObject를 다른 방법으로 가져와보자!

 

[시도 1] 

 

ObjectManager를 가지고 와서 빌드해주니까 ObjectManager를 식별할 수 없다는 오류가 뜸

현재 ObjectManager은 Actor Base인데 내가 만든 AnimInstance는 ActorBase가 아니기 때문임

 

따라서 AnimInstance에서 ObjectManager를 가져올 방법을 생각해내야 하고 ObjectManager는 GameMode를 상속 받으니까 이 GameMode를 AnimInstance에서 가져오면 된다.

 

 

해결

AnimInstance 용으로 GameMode랑 ObjectManager를 만들어줘야 하는데 임시로 처리해줌

 

 

배운것

 

Cast

- 언리얼 엔진에서는 레벨에 배치되는 모든 클래스가 AActor 클래스를 상속받고 있다.

따라서 몇몇 함수들에서는 메인이 되는 부모 클래를 매개변수로 받거나 돌려준다.

 

형 변환은 어떨 때 하는 것인가?

총알이 타겟에 맞았는지를 확인하고 싶다고 할 때 

NotifyActorBeginOverlap(AActor* OtherActor) 함수를 이용해서 확인한다고 가정해보자.

여기서 OtherActor이 정확히 총알일 때만 판별을 하고 싶을 때 Cast를 쓴다.

 

캐스팅(형 변환) | 언리얼 4 - YouTube

 

 

TryGetPawnOwner

APawn* UAnimInstance::TryGetPawnOwner() const
{
	USkeletalMeshComponent* OwnerComponent = GetSkelMeshComponent();
	if (AActor* OwnerActor = OwnerComponent->GetOwner())
	{
		return Cast<APawn>(OwnerActor);
	}

	return NULL;
}

 

댓글