컨텐츠 검색
[UE5 BP] 블루프린트로 텍스트 슈팅 게임 만들기 - 버그 수정 및 기능 추가

2025. 12. 1. 19:40Unreal Engine/개념

0. 들어가며 – 텍스트만으로 만드는 슈팅 게임

  • 과제 목표
    • 화면 UI 없이 텍스트 출력(PrintString / PrintText) 만으로 슈팅 게임 구현
    • 탄약, 재장전, 과열/냉각, 무기 교체까지 모두 단일 블루프린트에서 처리
  • 전체 입력 규칙 요약
    • Left Mouse Button: 사격
    • R: 재장전
    • T: 냉각
    • 0 / 1 / 2: 무기 교체 (Rifle / Shotgun / Pistol)

1. 레벨 블루프린트 한 장으로 짠 텍스트 슈팅 게임 구조

1.1. 텍스트 기반 UI 구조

  • 화면에 정보를 보여주는 방식
    • Print String, Print Text로 현재 상태(총알 수, 온도, 과열 상태, 무기 이름)를 출력
      • Print String
        • String 자료형 입력
        • 숫자, 벡터 등은 자동으로 ToString 변환됨
      • Print Text
        • Text 자료형 입력
        • UI에 쓰는 Text 변수 그대로 출력할 때 편함
        • 현지화 작업에 유리함
    • 디버그 메시지 색상/Duration 설정으로 상황 구분
  • 예시 텍스트
    • “총알이 없습니다!!”
    • “현재 총알 개수: {BulletCount}”
    • “현재 온도: {CurrentTemperature} ({CurrentHeatState} 상태)”
    • “Rifle을 착용했다! 최대 총알 개수: 30”

1.2. 상태 관리용 변수·구조체 설계

구조체를 사용하는 이유: 함수 입출력이 단순해지고, 재사용과 확장성이 좋다.

  • 단일 상태 변수
    • BulletCount: 현재 총알 개수
    • CurrentTemperature: 현재 온도
    • NewCurrentHeatState: 현재 온도 상태(Heat State Enum)
      • Enum(열거형): 쓸 수 있는 값의 범위를 강제로 제한하여 잘못된 값이 들어가는 것을 방지할 수 있다.
      • 상태 머신 / 게임 상태 / 무기 타입 등 표현에 최적이다.
    • MaxBulletCount: 현재 무기의 최대 총알 개수
    • CurrentWeaponIndex: 현재 무기 인덱스
  • 무기 데이터 구조
    • NewWeapons: 각 무기의 특성값(총알 개수, 이름, 온도 등)을 담은 구조체 배열
    • CurrentWeapon: 현재 선택된 무기를 담는 Weapon 구조체 단일 인스턴스

2. 버그 수정으로 기본 로직 안정화하기 (1번 과제)

2.1. 버그 ① – 30발 이상 격발되는 문제

  • 문제 상황
    • 탄창이 30발인데, 텍스트 상으로 31, 32… 발까지 발사가 되는 현상
  • 원인 분석
    • Left Mouse Button 입력 처리에서 BulletCount > 0 체크 없이 탄을 감소함.
  • 해결 방법
    • 사격 로직 앞에 BulletCount > 0 조건 추가
    • 0발일 때는 “총알이 없습니다!!”만 출력하고 탄/온도는 변경하지 않도록 수정
  • 검증
    • 30번 발사 후, 31번째에서 “총알이 없습니다!!”가 출력되는지 텍스트 로그로 확인

2.2. 버그 ② – 총알이 가득 차 있어도 재장전되는 문제

  • 문제 상황
    • BulletCount == MaxBulletCount 인 상태에서도 R 키를 누르면 “재장전!”이 출력
  • 원인 분석
    • R 키 처리에서 BulletCount < MaxBulletCount 조건이 누락
  • 해결 방법
    • BulletCount < MaxBulletCount 일 때만 재장전 수행
    • 그 외에는 “이미 장전되었습니다!!” 메시지만 출력
  • 검증
    • 0발 / 중간 탄 / 풀탄 상태에서 R 키를 눌렀을 때 텍스트 로그가 각각 어떻게 나오는지 확인

3. 과열/냉각 시스템 추가 (2번 과제)

3.1. SetTemperature 함수 – 온도 증감 로직

  • 함수 역할
    • 인자로 받은 In Increment 값만큼 CurrentTemperature를 증감
    • 증가/감소 후 값을 CurrentWeapon 구조체에 반영
    • SyncCurrentWeaponToArray 호출로 무기 배열(NewWeapons)에 저장
  • 과열 기준
    • 온도 값이 일정 구간(예: 0~30 / 31~70 / 71 이상)에 따라
      • Heat State Enum: Normal / High / Over 로 분류

3.2. ApplyHeatState 함수 – 과열/냉각 상태 적용

  • 함수 역할
    • 전달받은 Heat State Enum을 CurrentWeapon과 변수에 동기화
    • Print Text로 “현재 온도: {CurrentTemperature} ({CurrentHeatState} 상태)” 출력
  • 사격 / 냉각과의 연결
    • 사격 시: SetTemperature(+1) 호출 → 온도 값 변경 → 구간 판정 후 ApplyHeatState 호출
    • T 키 냉각: SetTemperature(-1) 호출 → 온도 값 변경 → 구간 판정 후 ApplyHeatState 호출

4. 무기 교체와 상태 분리 (3번 과제)

4.1. EquipWeapon 함수 – 텍스트 기반 무기 교체

  • 입력
    • New Index: 선택할 무기 인덱스
    • Max Bullet Count: 해당 무기의 최대 탄 수
  • 동작
    • SyncCurrentWeaponToArray로 현재 무기 상태 저장
    • CurrentWeaponIndex 변경
    • NewWeapons[NewIndex]를 꺼내 CurrentWeapon에 대입
    • MaxBulletCount 갱신 후
      • “{WeaponName}을 착용했다! 최대 총알 개수: {MaxBulletCount}” 출력

4.2. 0/1/2 키 입력에 따른 무기 교체 처리

  • 입력 처리
    • 0 / 1 / 2 키 각각에 대해
      • 이미 같은 무기면 무시
      • 다른 무기일 때만 EquipWeapon 호출
  • 무기별 특징
    • Rifle: MaxBulletCount 30
    • Shotgun: MaxBulletCount 10
    • Pistol: MaxBulletCount 50

4.3. 무기별로 독립된 탄/온도 관리

  • CurrentWeapon 구조체에
    • BulletCount, CurrentTemperature, CurrentHeatState, WeaponName이 묶여 있어서
    • 무기 교체 시 각 무기의 탄 수 / 온도 / 상태가 그대로 유지되는 구조
  • SyncCurrentWeaponToArray 함수로
    • 현재 무기 상태가 NewWeapons[CurrentWeaponIndex]에 항상 저장되도록 보장

5. 텍스트 게임 로직의 함수 리팩토링

5.1. 함수 목록과 책임 구분

  • SetTemperature: 온도 수치 증감 + 배열 동기화
  • ApplyHeatState: 온도 구간에 따라 Heat State Enum을 반영하고 텍스트 출력
  • EquipWeapon: 현재 무기 인덱스 변경 + 무기 데이터 로드 + 텍스트 출력
  • SyncCurrentWeaponToArray: CurrentWeapon 구조체를 NewWeapons 배열에 저장

5.2. 리팩토링 전/후 비교

  • 리팩토링 전
    • 사격, 재장전, 무기 교체마다 비슷한 SET 노드를 반복
    • 온도/과열 로직이 여기저기 흩어져 있어서 수정 포인트가 많음
  • 리팩토링 후
    • 입력 이벤트에서는 함수만 호출 → EventGraph가 훨씬 깔끔해짐
    • 무기를 추가하거나 온도 규칙을 바꿀 때,
      • 관련 함수만 수정하면 텍스트 출력까지 한 번에 바뀌는 구조

6. 마무리 회고

6.1. 텍스트 기반 개발에서 느낀 점

  • 화면에 캐릭터/총/바 UI가 없어도 탄 관리, 재장전, 과열, 무기 교체 같은 게임 로직은 그대로 구현 가능하다는 걸 알 수 있었다.
  • 오히려 UI/캐릭터에 신경 쓰지 않아서 순수하게 상태 변수와 분기 로직 설계에 집중할 수 있었다.

6.2. 다음 단계 아이디어

  • 지금 구조 유지한 채로 Widget UI 추가해서 텍스트 대신 HUD로 시각화

7. 블루프린트 코드 & 동작

실행 결과