언리얼 프로그래밍 튜토리얼
해당 부분을 따라하면서 코드를 치다가 의문점을 발견했다.
바로 이 부분이었는데 카메라 컴포넌트를 캡슐 컴포넌트에 붙이는 것까진 좋았다. 하지만
이 부분이 내 환경(언리얼 4.27.2, visual studio 2019)에서는 에러를 뱉어댔다. UCapsuleComponent 포인터를 USceneComponent포인터로 바꿀 수 없다고 말이다.
그래서 UCapsuleComponent 계층구조가 어찌 되는지 살펴보았다.
UCapsuleComponent <- 중간 생략 ... <- USceneComponent 로 USceneComponent를 상속 받고 있엇다. 그런데 왜 바꿀 수 없다는 거지? 하고 형변환을 몇 개 시도해보았다.
static_cast -> 바꿀 수 없다.
dynamic_cast -> 마찬가지로 바꿀 수 없다고 한다.
(USceneComponent) -> 바로 한 큐에 해결되었다.
어떤 차이점이 있는가 했더니 일반적으로 쓰는 형변환의 경우 강제로 변환하고 그 뒷감당을 프로그래머에게로 넘긴다. 그래서 계층구조상 맞는 변환이니 오류 없이 잘 동작하였다.
static_cast MSDN 설명
dynamic_cast MSDN 설명
SceneComponent가 CapsuleComponent의 부모니까 upcast니까 둘 다 동작해야하는데 컴파일 단계에서 못하게 블락이 된다. 그래서 이유를 찾으려고 Character의 모체 클래스인 ACharacter로 접근해봤다.
헤더파일에 class UCapsuleComponent가 전방선언되어있다. 포인터만 사용할 경우 형식으로 사용할 수 있지만 구체적인 내용에 대해서는 모르기때문에 내부에 멤버는 사용할 수 없는 선언이다. 그렇기 때문에 해당 GetCapsuleComponent가 전방선언된 형식 CapsuleComponent이기때문에 부모자식관계인지 판단할 수 없었던 것이였다.
해결방법은 내가 발견한 것은 크게 2가지였다. 내가 만든 Character 헤더파일에 #include "Components/CapsuleComponent"를 추가하거나 C 타입의 일반적인 형변환으로 강제하는 방법이다.
어떤게 더 낫다라고 판단하기엔 아직 내 경험치나 이해도가 부족하지만 안전성으로 장점이 있으니까 dynamic_cast를 쓰는게 좋아보이기도 한다.