[UE5]툰 탱크-7

칼든개구리·2024년 12월 10일
0

[언리얼TO리얼]

목록 보기
17/42

오늘은 빙의에 대한 이야기를 다뤄본다.


현재 맵에 폰이 많이 있지만 플레이어라고 할 수 있는 폰을 설정해두진 않았다.
그래서 저상태로 그냥 실행을 누르게 되면 기본 폰이 작동하여 WASD를 사용하여 맵을 움직일 수 있다. 파란색 탱크를 폰으로 지정하고 싶으면 디테일 창에서 auto possess player을 검색한 후에 Disabled라고 되어있는 것을 player0으로 설정하면 된다
폰에 빙의 시키기 위해 player0으로 설정해두고 게임을 시작하면 player 0은 폰에 빙의하게 된다.


move forward 부분의 w s는 각 축 매핑에 키를 할당하는 부분이다. MoveForward는 전방 이동,

축 매핑이란?
언리얼 에서는 축 매핑을 제공하고, 게임에선 프레임 마다 축 매핑이란 걸 처리 한다.
축 매핑엔 키를 할당한다. 사진에서 볼 수 있듯이 w는 1.0, s는 -1.0의 scale 값을 주었다.
입력 값을 처리할 때 이 값들이 영향을 끼친다.
축 매핑은 이렇게 작동한다.
전방 이동 매핑은 C++의 함수와 연결돼 있다. 축 매핑에 함수를 연결하면, 연결되는 함수는 (Move(float value)) float 타입의 인자를 받는다. 우리가 폰에 Move 함수를 추가하면 되는 것이다. float 타입을 인자로 받는 함수고 이름은 Move로 하며, 인자의 이름은 value로 한다.
함수를 전방 이동 축 매핑이랑 연결시키는 방법이 존재하는데, 이렇게 연결하는 걸 Move 함수를 축 매핑에 바인드 시킨다고 말한다.

언리얼 엔진의 인풋 시스템은 프래임 마다 확인을 하며, w키나 s키가 눌렸는지에 대해 말이다.
우리가 그 키를 누르고 있는지 아닌지 확인하고 그에 따라 좌표를 계산한다. 매 프레임마다 바인드 한 이 함수를 호출하여 그 축의 값을 전달한다.
w나 s를 누르고 있지 않다면 축의 값은 0이다. 전방 이동 축에 바인드 된 Move(0.0)함수는 프레임이 바뀔때 마다 호출되고 이때 전달된 인수는 0이다.
만약 w를 누른 상황이라면? w키의 스케일 값은 1.0이다. w키를 눌렀다면 축의 값은 1.0이고 이 값이 Move함수에 전달된다(Move(1.0)) 프레임이 바뀔때 마다 Move 함수는 1.0이란 인수로 호출되는 것이다
만약 s를 누른 상황이라면? s키의 스케일 값은 -1.0이다. 역시 매 프레임 마다 Move 함수가 호출될 때 -1.0이 전달되는 것이다. 당연히 w와 s를 동시에 누른다면 두 값이 함께 전달된다. 이때 인수는 0이 된다.
어떤 키 조합을 누르냐에 따라서 move함수의 인수가 달라지게 된다.

이제는 전방 이동 매핑에 바인드할 함수를 Tank.cpp에서 만들어본다.

void ATank::Move(float Value)
{

}

이렇게 만들고 바인드 작업은 SetupPlayerInputComponent함수 안에서 해줘야 한다.

void ATank::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

}

가상 함수를 오버라이드 할 때는 상위 버전을 호출하는 것이 좋은 방법이다. SetupPlayerInputComponent는 축 매핑을 위한 함수를 바인드 할 때 도움이 되는 함수다.
전방 이동 축 매핑에 Move 함수를 바인드 해야하는데 SetupPlayerInputComponent를 이용해
PlayerInputComponent를 사용하여 바인드 한다.

void ATank::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
	PlayerInputComponent->BindAxis(TEXT("MoveForward"),this,&ATank::Move);
}

PlayerInputComponent는 포인터니까 화살표 연산자를 붙이고, BindAxis라는 함수를 호출한다.
BindAxis는 3가지 인수가 필요한데 첫번째는 문자열 리터럴이기 때문에 TEXT 매크로를 사용한다.
""안에는 축 매핑의 이름을 넣어주고, 두 번째 인자는 함수를 바인드하는 대상 객체의 포인터이다.
this는 포인터로 현재 위치한 클래스를 가리킨다. 지금 Tank 클래스에 있으니 이 포인터는 게임 안에 있는 탱크 폰 인스턴스를 가리킨다. 세번째는 바인드시키는 함수의 주소이다.
&ATank::Move 함수를 적어줄 때 클래스 이름과 &연산자도 중요하다.

void ATank::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
	PlayerInputComponent->BindAxis(TEXT("MoveForward"),this, &ATank::Move);
}

void ATank::Move(float Value) // 매 프레임마다 value값과 호출된다
{
	UE_LOG(LogTemp, Warning, TEXT("Value: %f"), Value);
}

실행시키고 w와 s키를 눌러봤을 때 값이 잘 출력되는 것을 볼 수 있다.

profile
메타쏭이

0개의 댓글