unreal 5기

250806 언리얼엔진 본캠프 3일차 TIL 과제 - 텍스트기반 슈팅게임을 만들어보자

parkjinnam 2025. 8. 6. 16:09

오늘은 본캠프 오전세션에서 튜터님이 제시한 과제를 한번 만들어 보려고 한다. 텍스트 기반의 간단한 슈팅게임을 만드는 것인데

다음의 조건을 만족하는 게임을 만들어야 한다.

  • 총알은 기본적으로 30발.
  • 마우스 좌클릭을 할 때마다 총알이 1발씩 소모됨.
  • 키보드 R을 누르면 재장전되어 총알 30발로 충전됨.

일단 신규 레벨을 생성해주고 레벨 블루프린트 창을 열어준다음 Bullet 변수를 만들어 주도록 하겠다. 플레이가 시작되면 기본 Bullet 값이 30이 되게끔 지정해 주고 마우스 좌클릭을 했을 때마다 Bullet 값에서 1발씩 감소하도록 다음과 같이 짜준다.

 

여기서 현재 잔탄 개수를 확인하기 위해서 Print String노드를 이용해서 잔탄을 출력하게끔 한후 컴파일 실행해 보도록 하자.

잔탄이 표시된다.

 

이제는 재장전 로직을 짜주도록 하자. 키보드 버튼 R을 눌렀을 때 Bullet 값을 30으로 재설정 해주도록 하자.

전체적인 블루프린트 모습

 

하지만 이 로직에는 버그가 존재한다. 첫번째로 잔탄이 0 밑으로 내려가도 -1, -2,... 순으로 계속 발사가 되는 버그와 Bullet값이 30 임에도 계속 재장전을 할 수 있는 버그가 있다 하나하나 다시 고쳐보도록 하자.

첫 번째 버그는 어떻게 고치면 될까? Branch를 이용하여 잔탄이 0보다 클 경우에만 작동하도록 그리고 0이면 Out of ammo 텍스트가 출력되도록 해보자.

정상적으로 작동한다

 

두 번째도 마찬가지로 Branch를 이용하여 잔탄이 30발보다 적을 때 재장전이 가능하도록 하고 30 발인 상황에서 재장전 시도 시 Already full... 텍스트를 출력하도록 해보자

작동한다

 

이번에는 두번째 퀘스트를 해보자 과열기능을 추가하는 것이다. CurrentTemperature 속성을 추가하여 이 값이 0~30이면 normal, 31~70까지는 High 71 이상은 Over가 되도록 해보도록 하자. CurrentTemperature integer변수로 그리고 상태 값을 표시하기 위해 CurrentHeatState는 String이라는 변수로 설정해 주도록 하자.

이를 이제 좌클릭을 했을때 동작에 Sequence 노드로 연결해 주면 발사와 동시에 과열도 같이 될 것이다.

잘 작동한다

 

이제는 과열이 줄어드는 시스템을 만들어 보자 T키를 입력했을 때 과열이 줄어들게끔 하면 된다.

 

근데 과열과 냉각 로직 모두 +1을 하냐 -1을 하냐 차이일 뿐 로직이 :똑같다 이 부분을 함수를 이용해서 해결하면 된다고 한다.

InIncrement 값을 추가해주고
값만 수정해주면 중복되는 코드가 훨씬 간략해진다

 

자 이제는 fps의 꽃인 무기 스왑을 한번 구현해 보자 간편하게 관리하기 위해서 스트럭쳐를 이용해주려고 한다. 새 스트럭처 Weapon을 생성해 주고 각 변수 Bullet, CurrentTemperature, CurrentHeatState, WeaponName을 추가해 준다 그다음 새로운 변수를 생성해주고 형식을 Weapon 스트럭처로 지정해준다 그다음 디테일 패널에서 Array형식으로 변경, 인덱스를 3개를 추가해준 후 각각 Rifle, Shotgun, Pistol의 이름과 각 총기마다 탄약수를 부여해 준다. 자 이제 준비는 끝났다.

 

이제 0번을 눌렀을 때 라이플, 1번을 눌렀을 때 샷건, 2번을 눌렀을 때 피스톨이 장착되게 해야 한다. 일단 텍스트 기반의 게임이기 때문에 시각적인 피드백이 없으므로 무엇이 장착되었는지 명확하게 하기 위해서 장착된 무기가 출력되도록 해준다.

 

이제 새로 추가한 NewWeapon의 값을 가져오기 위해 get(a ref)를 이용해서 사격과 과열, 냉각 로직을 수정해 보자.

 

이렇게 진행했을 때 한 가지 문제가 생겼다. 샷건이나 피스톨을 장착한 상태에서 재장전을 하면 8발, 10발이 아닌 30발이 되어버리는 현상이 있었다. 기존에는 Set Array Elem의 Bullet에는 아무런 연결 없이 30으로 설정해 두었던 것이 원인으로 생각되어 스트럭쳐에 Bullet 값을 CurrentBullet으로 변경, 새로운 인덱스로 MaxBullet을 추가해 준 다음 무기별로 최대 탄약수를 지정해 주고 노드를 다시 연결해 주니 정상적으로 적용되는 것을 볼 수 있었다.

장전 로직에서 MaxBullet을 CurretBullet에 연결해주면 각 총기류 별 최대 장전수 만큼 장전된다.

 

이로서 즐겁게 셋째 날 과제를 마칠 수 있었다. 하면서 생긴 오류를 해결하기 위해서 이리저리 고민해 보는 시간도 정말 즐거웠던 것 같다.