BP_Gun을 잡은 상태에서 Trigger를 당기면 총알이 나가는 로직을 구현해보자.
내가 지금 물건을 쥐고있는 손이 왼쪽, 오른쪽인지를 반환하는 함수를 Grab Component 내부에 구현해준다.
Hand의 bLeftHand를 읽어서 True이면 Left, False이면 Right를 반환한다.
반환 타입인 Enum Controller Hand는 언리얼에서 제공하는 타입으로 Left, Right, Any Hand 같은 것들이 이미 들어가 있다.
추가적을 Pure를 눌러서 Pin이 연결되지 않더라도 바로바로 꺼내서 사용할 수 있도록 한다.
OnGrabbed와 OnDropped라는 이름으로 EVENT DISPATCHERS에 Delegate를 두 개 만들어준다.
이벤트 디스패처에 관한 자세한 설명은 공식 문서 참고
이제 Handle Grab의 끝부분에 Call OnGrabbed를 넣어서 그랩이 일어났다고 모두에게 알리도록 한다.
Release 또한 똑같이 방송해준다.
이렇게 하면 해당 이벤트를 구독 신청 해놓은 오브젝트는 해당하는 이벤트 발생에 따른 기능을 수행하게 될 것이다. 따라서 해당 호출을 받도록 해보자. 이제 BP_Gun으로 가면 Events에 OnGrabbed와 OnDropped가 생긴것을 확인할 수 있다.
+를 눌러서 구독 신청을 하자.
이제 OnGrabbed와 OnDropped가 발생하면 해당하는 로직을 실행할 수 있다. 즉, 호출을 받을 준비가 됐다고 할 수 있다.
왼손 Grab이냐 오른손 Grab이냐에 따라 적절한 Input Mapping Context를 변경해준다. 손을 놓을때는 해당 Context를 다시 제거시켜준다.
변경해줄 IMC를 만들어주기 위해 IA_VR_Shoot_Left와 IA_VR_Shoot_Right를 아래와 같이 만들어준다.
이제 IMC도 왼쪽, 오른쪽을 따로 만들어주자. IMC_VR_Weapon_Left와 IMC_VR_Weapon__Right을 다음과 같이 만들어준다.
이제 아까 위에서 해놨던 이벤트 디스패처를 이용해 OnGrabbed와 OnDropped에 따른 이벤트 처리를 구현한다.
먼저 플레이어 컨트롤에서 인풋을 처리하는 스택에서 이 액터를 등록한다. 이러면 플레이어 폰이 아니어도 입력을 받을 수 있다.
GetGrabbingHandType으로 어떤 손으로 물건을 Grab했는지에 따라 IMC가 선택되도록 한다.
이제 Grab한 손에 따라 다른 IMC가 적용되도록 구현한다.
IMC는 위에서 사전에 만들어 놓았던 IMC_VR_Weapon을 사용한다.
이제 바꾼 IMC를 OnGrabbed의 경우에는 Add Mapping Context를 해줘서 해당 IMC로 Input을 받아 IA를 매핑 시키고, OnDropped의 경우에는 해당 IMC를 RemoveMappingContext해서 제거해줘 다시 매핑을 풀어준다.
이제 IMC가 매핑됐다고 생각하고 IA_VR_Shoot_Left와 IA_VR_Shoot_Right 이벤트 발생 시 실행할 기능을 추가해주자.
다시 한 번 Grab한 손을 더블 체킹해준다.
이제 Muzzle Location 오브젝트에 맞춰서 Make Transform 해준다음 해당 위치에서 총알이 복사되서 발사되도록 한다.
총구 쪽에서 발사 시킬 수 있도록 소켓, 즉 위치를 잡아주는 새로은 Scene 컴포넌트를 MuzzleLocation으로 하나 추가한다.
- 대부분은 X축(빨강 화살표)가 발사되는 방향을 향하도록 설정한다.
Rotation을 Z = 90으로 설정하면 된다.
Spawn class는 Projectile로 설정해준다. 언리얼에서 제공하는 클래스로 추후에 직접 분석해서 구현할 예정이다.