Fire 함수를 만들고 이 함수를 마우스 왼쪽버튼과 연결해보겠다.
발사체를 스폰할 때 사용하는 함수이다. Fire 함수를 만들고 이 함수를 동작 매핑에 바인딩하도록 하겠다
축 매핑처럼 동작 매핑에도 함수를 바인딩해야 한다. 축 매핑은 게임의 모든 프레임마다 실행된다. Tick함수와 비슷하고 누르는 버튼에 따라 전달되는 float 값이 달라진다.
동작 매핑은 약간 다르게 동작한다. 동작 매핑에 바인딩된 콜백 함수는 인풋 매개 변수를 사용하지 않는다. 버튼을 누르면 함수가 호출될 뿐이다. 동작 매핑은 일회성이며 모든 프레임에서 실행되지 않는다. 버튼을 누를 때만 동작하고 버튼을 놓은 후 다시 누르면 함수가 한번 더 실행된다.
축 매핑에 함수를 바인딩 할 때는 BindAxis를 사용하였는데, 동작 매핑에는 BindAction함수를 사용하고 인풋은 BindAxis와 유사하다. 동작 매핑의 이름을 문자열 리터럴로 입력한다(BindAction(TEXT(""))). 이때 바인딩 하는 함수의 클래스 포인터도 필요한데, 여기서는 this를 사용하면 되고 콜백 함수도 물론 필요하다. 여기서는 추가 매개 변수로 enum 상수를 사용해서 버튼을 눌렀을 때 이 함수를 실행할지, 놓았을 때 실행할지 지정해야 한다.
enum 상수의 인풋 매개 변수에는 두 가지 옵션이 있다. IE_Pressed와 IE_Released이다.
BindAction을 호출할 때 IE_Pressed를 입력하면 버튼을 눌렀을때로 콜백 함수가 바인딩 되고,
IE_Released를 사용하면 버튼을 놓았을 때 콜백 함수가 호출된다.
void ABasePawn::Fire()
{
}
탱크와 터렛 모두 발사체를 발사하기 때문에 부모에서 함수를 만들어 준다. 하지만 이 함수는 Tank클래스에서만 바인딩을 한다. Tank클래스에서만 사용자 인풋을 사용하기 때문이다.
void ABasePawn::Fire()
{
FVector ProjectileSpawnPointLocation = ProjectileSpawnPoint->GetComponentLocation();
}
이제 ProjectileSpawnPoint의 위치를 알 수 있으니 이걸 이용해 DrawDebugSphere를 호출하면 된다.
void ABasePawn::Fire()
{
FVector ProjectileSpawnPointLocation = ProjectileSpawnPoint->GetComponentLocation();
DrawDebugSphere(
GetWorld(),
ProjectileSpawnPointLocation,//중심좌표
25.f,
12,
FColor::Red,
false,
3.f //디버그 구체 지속시간
);
}
아... 비쥬얼 스튜디오에서는 빌드 되는데 언리얼에서 컴파일이 안돼서 왜그런가 하고 gpt 선생님께 물어봤더니
Saved, Intermediate, Binaries를 함 지우고 .uproject에서 generate visual studio project files를 누르면 다시 된다... 잘 알아두자..
결과로 보면 마우스로 찍는 부분에 공이 생기고 3초 뒤에 사라지는 것을 볼 수 있다.