2024-04-02
깃허브! |
---|
https://github.com/ChangJin-Lee/ARproject |
★ https://github.com/ChangJin-Lee/ToonTank |
느낀점
AController가 APlayerController의 상위 타입의 오브젝트이다. 그러니 AController 로 선언한 변수에 APlayerController를 할당할 수 없다. Cast 함수를 써서 할당해주어야한다.
정의는 다음과 같다.
Controllers are non-physical actors that can possess a Pawn to control its actions.
APlayerController의 상위 타입의 오브젝트이다.
우리는 폰의 회전을 구현하기 위해서 마우스의 위치를 사용하고 싶다. 그래서 AController를 가져오려고 한다. 마우스 커서가 현재 가르키고 있는 위치를 가져올 수 있다면 캐릭터의 얼굴 혹은 몸을 그쪽 방향으로 향하게끔 만들 수 있다.
PlayerController.h에 다음처럼 선언되어 있다.
public:
/** Default Constructor */
APlayerController(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
APlayerController::APlayerController(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
정의는 다음과 같다.
PlayerControllers are used by human players to control Pawns.
폰을 컨트롤하기 위해서 사용되는 녀석이다. 우리는 GetController()를 통해서 Controller를 가져오려고 하는데 반환값이 AController이기 때문에 AController에 바로 사용할 수가 없다.
FORCEINLINE AController* APawn::GetController() const
{
return Controller;
}
PlayerControllerRef = Cast<APlayerController>(GetController());
"AController의 타입 APlayerController에 대입할 수 없습니다"
이게 무슨 이유냐면..
AController가 상위 타입의 오브젝트이다. 상위 타입의 오브젝트를 가져와 하위 타입 포인터에 저장할 수 없다. 즉 Cast를 해주어야한다!
AController 포인터 타입의 값이 있을 경우, Cast라는 함수를 사용해 포인터 타입을 APlayerController로 바꿀 수 있다. 오브젝트 자체가 캐스팅하려는 타입에 해당한다면, 캐스팅은 한 포인터 타입을 다른 포인터 타입으로 바꿔준다
유효하지 않은 타입으로 캐스팅하려고 할 경우, 예를들어 APlayerController 오브젝트를 가리키는 AController 타입을 ACharacter에 캐스팅하려고 한다면 Cast 함수가 Null을 반환하고 캐스팅에 실패한다.
Cast 함수는 다음처럼 쓴다.
Cast<타입>(포인터변수) 로 쓴다.
PlayerControllerRef = Cast<APlayerController>(GetController());