[UE5] TIL - 14 <AController, APlayerController, Cast>

ChangJin·2024년 4월 2일
0

Unreal Engine5

목록 보기
41/114
post-thumbnail

2024-04-02

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/ToonTank

느낀점
AController가 APlayerController의 상위 타입의 오브젝트이다. 그러니 AController 로 선언한 변수에 APlayerController를 할당할 수 없다. Cast 함수를 써서 할당해주어야한다.

TIL

  • AController
  • APlayerController
  • Cast

AController

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/GameFramework/AController?application_version=5.3


  • 정의는 다음과 같다.

  • 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());
  • PlayerController.cpp에는 다음처럼 선언되어 있다.
APlayerController::APlayerController(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)


APlayerController

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/GameFramework/APlayerController?application_version=5.3

  • 정의는 다음과 같다.

  • PlayerControllers are used by human players to control Pawns.

  • 폰을 컨트롤하기 위해서 사용되는 녀석이다. 우리는 GetController()를 통해서 Controller를 가져오려고 하는데 반환값이 AController이기 때문에 AController에 바로 사용할 수가 없다.


  • Pawn.h에 다음처럼 선언되어 있다.
FORCEINLINE AController* APawn::GetController() const
{
	return Controller;
}


Cast

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/casting-quick-start-guide-in-unreal-engine?application_version=5.3

  • cpp 파일에서 다음처럼 선언하면 오류가 뜬다. (헤더 파일에 APlayerController* PlayerControllerRef;)
PlayerControllerRef = Cast<APlayerController>(GetController()); 

"AController의 타입 APlayerController에 대입할 수 없습니다"


  • 이게 무슨 이유냐면..

  • AController가 상위 타입의 오브젝트이다. 상위 타입의 오브젝트를 가져와 하위 타입 포인터에 저장할 수 없다. 즉 Cast를 해주어야한다!

  • AController 포인터 타입의 값이 있을 경우, Cast라는 함수를 사용해 포인터 타입을 APlayerController로 바꿀 수 있다. 오브젝트 자체가 캐스팅하려는 타입에 해당한다면, 캐스팅은 한 포인터 타입을 다른 포인터 타입으로 바꿔준다

  • 유효하지 않은 타입으로 캐스팅하려고 할 경우, 예를들어 APlayerController 오브젝트를 가리키는 AController 타입을 ACharacter에 캐스팅하려고 한다면 Cast 함수가 Null을 반환하고 캐스팅에 실패한다.

  • Cast 함수는 다음처럼 쓴다.

Cast<타입>(포인터변수) 로 쓴다.

PlayerControllerRef = Cast<APlayerController>(GetController()); 
  • 이제 오류가 없어졌다
profile
게임 프로그래머

0개의 댓글