Unreal Engine 5 - Project Shooter (2): 총기 시스템

mingu Lee·2025년 8월 5일

1. 간단 요약


  • 과녁 시스템 구현.
  • 총기 시스템 구현

2. 세부 과정


  1. 과녁 시스템
  2. 총기 시스템

2-1. 과녁 시스템


과녁은 다음과 같은 기능이 필요함.

  1. 플레이어가 특정 위치에 도달하면 누워있다가 세워짐. (최초 1번)
  2. 플레이어가 쏜 총에 피격 시 다시 누움. (일어나 있을 때만)

Enumeration을 사용하여 과녁의 상태를 지정.

Ready: 누워있으면서 일어날 수 있는 상태
Ready to Standing: 일어나고 있는 상태
Standing: 일어나 있는 상태
Standing to KnockDown: 눕고 있는 상태
KnockDown: 누워있는 상태

Event Graph는 다음과 같이 구성.

StandUp Trigger Volume에 닿았을 경우 StandUp 함수 호출.

목표 각도와 회전 시간 등을 초기화.

KnockDown 함수도 StandUp 함수에서 초기화 값만 다르고 나머지는 똑같음.

이렇게 설정된 값들을 Event Tick에서 Rotate 함수를 호출하여 회전함.

회전 시간이 0보다 클 경우 프레임마다 '총 회전 각도 / 총 회전 시간 * Delta Time' 만큼 회전함.

초록색 원뿔이 StandUp Volume, 빨간색이 KnockDown Volume, 파란색이 Reset Volume이다.

2-2. 총기 시스템


총기 구현을 위해 새로운 Input Action 생성.

Aim, Fire, FireMode, Reload, SwapMain, SwapSub를 생성함.

첫 번째로, Fire를 구현함.

아직 Asset을 구하지 않았기에 간단하게 Cube를 사용하여 총기를 만듦.

맨 앞부분은 총알이 발사될 Transform.

이 Blueprint를 Character에 추가해야 하는데, 일반적으로는 내가 만든 BP를 Component로 추가하는 것이 불가능함.

이는 Child Actor Component를 Character에 추가하여 Weapon Class로 설정하는 방법으로 Weapon을 부착하면 해결할 수 있음.

Bullet도 간단하게 작은 Sphere를 사용하여 생성.

Bullet이 생성될 경우 Forward 방향으로 이동하도록 노드를 구성. (Physic는 사용 X)

이렇게 만든 Bullet을 Weapon의 Fire 함수에서 총알이 남아있을 경우 Spawn Actor 노드를 사용하여 생성해줌.

기본 최대 총알 수는 30으로 설정함.

마우스 좌클릭 시 총알이 잘 발사되는 것을 볼 수 있음.

이때, Target이 Bullet에 충돌 시 KnockDown 함수가 실행되도록 추가.

두 번째로, Reload를 구현함.

Reload는 간단하게 R키를 눌렀을 때, 현재 남아있는 Bullet의 개수를 Max로 다시 초기화해줌.

Print는 테스트를 위해 추가해놓은 것.

세 번째로, FireMode를 구현함.

발사 방식을 조절하는 기능으로, Full Auto와 Semi Auto 방식으로 발사 가능.

Semi Auto는 기존의 방식이므로 Full Auto만 구현하면 됨.

현재 FireMode를 Enumeration으로 설정하여 현재 FireMode가 Full Auto일 경우 Fire 함수가 끝나고 다시 Fire 함수를 호출하도록 노드를 구성.

이때, Full Auto일 때 마우스를 떼면 예약한 Fire 함수를 취소해야하기 때문에 Timer Handle 변수를 추가하여 버튼 Released 시 호출을 취소함.

B 키를 누르면 ChangeFireMode 함수를 호출하도록 설정.

왼쪽 상단을 보면 현재 남은 총알의 개수와 Reload, FireMode 변경이 모두 제대로 작동하는 것을 볼 수 있음.

네 번째로, Swap을 구현함.

게임에서 Main과 Sub 무기를 들고 다닐 것이므로, Weapon을 한 가지 더 만듦.

등 뒤에 부착하고 다니며, Swap 키를 눌렀을 때 해당 무기로 Swap이 가능하도록 함.

무기의 Type을 구별하기 위해 Enumeration을 사용했고, Main <--> Sub 간에 올바른 Type끼리 Swap할 때만 Swap이 되도록 함.

다음으로, Character에서 현재 장착하고 있는 Weapon과 등에 달린 Weapon Actor를 서로 바꾸는 작업을 담당하는 SwapWeapon 함수 생성.

뽑을 Weapon과 넣을 Weapon을 지정하고, Attach Actor To Component 노드를 사용하여 Character가 손에 들고 있는 Weapon과 등에 메고 있는 Weapon을 서로 Swap.

실제 Weapon Actor는 Child Actor에 담긴 Actor를 미리 담아두고 있음.

Weapon을 Swap해도 해당 Weapon의 Bullet, FireMode는 개별로 적용되는 것을 볼 수 있음.

3. 구현 중 발생한 문제 및 해결방안


  • 처음엔 Weapon을 Character의 Mesh에 부착했었는데, Weapon 또한 Static Mesh이기 때문에 Character와 Weapon이 충돌하여 정상적으로 움직여지지 않음.
    이를 해결하기 위해 Weapon의 Collision Preset을 수정하여 Character와 충돌하지 않도록 설정.
    하지만 이렇게 해도 문제가 발생했는데, 카메라를 돌릴 경우 Weapon이 Character Mesh에 붙어있기 때문에 카메라에서 벗어나는 현상이 발생함.
    이 문제도 해결하기 위해 Controller Rotation Pitch를 활성화 시켜봤지만, 이 방법 또한 Character가 Controller를 따라가다 보니 바닥을 보면 Character의 Forward가 바닥을 향하게 되어 움직임이 정상적으로 제어되지 않음.
    Controller Rotation Pitch를 다시 비활성화하고, Weapon이 아예 Camera를 따라가도록 Camera의 Child로 설정하여 해결함.

4. 오늘의 결과물


과녁 시스템과 총기의 Fire, FireMode, Reload, Swap 모두 제대로 작동하는 것을 볼 수 있음.

profile
Github: https://github.com/dlalsrn

0개의 댓글