플레이어 사격 시 총기 반동

작성일 : 2024 - 03 - 20 작성자 : 이승준
이미 구현된 사격에서 반동을 집어 넣는 건 꽤 간단해 보였다. Lerp를 사용해서 플레이어의 카메라를 올렸다 올린만큼 다시 내리면 된다. 원리는 간단하여 사격하는 함수에서 OnRecoil이라는 코루틴을 호출하게 만들고 OnRecoil함수를 제작하기 시작하였다.
필요한 변수는 다음과 같다. 반동이 일어나면 우선 무기의 반동 값이 필요하다. → Weapon.currentStat.recoil 반동을 받으면 움직일 카메라가 필요하다. → Weapon.stateMachine.playerStateMachine_.playerCamTransform 반동이 일어나도 카메라 회전이 고정되어선 안된다. 그러므로 카메라가 움직이는 게 아니라 카메라의 회전 값에 변화를 주어야 한다. → Weapon.stateMachine.playerStateMachine_.camXRotate
반동을 일으키기 위해 가져와야 할 데이터 문제)
필요한 변수들을 생각해보니 총기에서 플레이어의 데이터(플레이어 뷰 카메라)를 가져와야만 하는 경우가 발생해 어느 타이밍에 이것들을 적절하게 가져올 수 있을지 많은 고민이 필요했다. 결국 플레이어가 시작하면서 현재 장비중인 총기에 자신의 스테이트 머신을 넘겨주는 방법으로 이를 해결했다. 다른 총기가 생기면 그 땐 총기를 장착할 때마다 자신의 스테이트 머신을 넘겨주는 방법을 사용해야 할 듯 하다.
총기 반동 구현에 대한 문제)
반동을 구현하기 위해 위로 올라갔다 내려오는 작업을 하나의 사이클로 생각하고 코루틴을 사용해 작업하였으나, 생각보다 쉽지 않았다. 코루틴이 진행중인 도중에 다른 코루틴이 들어와 해당 코루틴을 사용하지 않도록 막아 놓는다면 반동이 지속되는 동안 추가 사격을 했을 때 내려가는 도중이나 올라가는 도중에 연속해서 올라가지 않아 반동이 다시 내려올 동안 새로운 반동이 일어나지 않는다. 반대로 막지 않는다면 반동이 지속되는 동안 새로운 코루틴이 난입해 반동이 올라갈지 내려갈지 정하는 목표 지점이 두 개가 되어 문제가 터지게 된다. 이를 해결하기 위해 코루틴 밖에서 코루틴이 진행중인지 아닌지 판별하여 코루틴이 진행중이라면 StopCoroutine을 실행하는 것으로 해결하였다. 이를 통해 반동이 진행중이라도 해당 지점에서 멈추고 다시 반동을 실행시키는 것으로 문제를 해결하였다.