본 프로젝트는 미니게임천국5의 무찔무찔 미니게임을 언리얼 5.7.4로 모작한 프로젝트이다.

image-1779346722066

image-1779346768289


시작 구조

플레이어는 좌우 이동 대신 방향만 전환하고, 각 구간에 들어갔을 때 적이 스폰되며, 현재 스테이지 적들만 미니맵에 보이게 만드는 구조였다.

처음 문서에 적어둔 흐름은 대략 이런 형태였다.

SpaceBar 입력
-> 캐릭터 앞/뒤 방향 전환

플레이어가 구간 진입
-> 적 스폰
-> 미니맵 갱신
-> 스테이지 정리 후 다음 구간 이동

이 구조만 보면 단순해 보이지만, 실제로는 적 스폰, 점수, 보스, 카메라, 드롭, 미니맵이 전부 같은 흐름 위에 올라가게 됐다.
그래서 후반으로 갈수록 중심 축이 필요했고, 그 역할을 RoundManager가 맡게 됐다.

개발 흐름

중간부터는 기능을 하나씩 더하는 느낌보다, 이미 들어간 시스템들을 한 흐름으로 다시 묶는 작업이 더 많았다.
팀원이 C++ 구현이 익숙하지 않아서 팀원이 구현한 내용을 다시 리팩토링해야할 일이 잦았다.

전투 흐름

전투 쪽은 CombatComponent를 중심으로 정리했다.
자동 공격, 무기 장착, 투사체/근접 무기 스폰, 피해 전달이 이 컴포넌트에 모인다.

UCombatComponent::StartAutoAttack()
-> World->GetTimerManager().SetTimer(AutoAttackTimerHandle, ...)
-> HandleAutoAttack()
-> SpawnMeleeWeapon() 또는 SpawnProjectileWeapon()
-> 무기 액터 초기화

이 구조가 들어가면서 플레이어 입력에 직접 공격을 묶는 대신,
공격 주기와 무기 타입을 컴포넌트가 관리하도록 분리됐다.

또 무기 액터 쪽에서는 공격 결과를 다시 CombatComponent로 되돌린다.

AWeaponBase::InitializeWeapon(...)
-> OwningPlayerCharacter 저장
-> OwningCombatComponent 저장

ASwordAttackActor / AWeaponProjectile
-> 적 충돌
-> OwningCombatComponent로 결과 전달

무기 레벨, 드롭 무기 교체, 투사체형 무기 추가가 처리된다.

상태와 성장

플레이어 상태는 StateComponent가 맡는다.
체력, 경험치, 레벨, 피해 처리, 회복, 무적 시간 같은 기본 상태가 이쪽에 모여 있다.

UStateComponent::ApplyDamage(...)
-> 체력 감소
-> 피격 처리
-> 사망 여부 판정
-> 상태 이벤트 브로드캐스트

UStateComponent::AddExperience(...)
-> 경험치 증가
-> 레벨업 조건 확인
-> OnExperienceChanged.Broadcast(...)
-> OnLevelUp.Broadcast(...)
UMZHUDWidget::BindStateComponent(...)
-> OnHealthChanged 바인딩
-> OnExperienceChanged 바인딩
-> OnLevelUp 바인딩

UDamageTextManagerComponent::BindStateComponent()
-> OnDamaged 바인딩
-> OnLevelUp 바인딩

라운드와 스테이지

초기 문서에서 구상했던 “구간 진입 -> 적 스폰 -> 미니맵 갱신 -> 다음 구간”은 최종적으로 RoundManagerGameMode 중심으로 묶였다.

MZGameModeRoundManager를 잡고,
HUDMinimapWidget은 다시 GameMode를 통해 현재 RoundManager에 연결된다.

AMZGameMode
-> RoundManager 보관

UMZHUDWidget::BindRoundManager()
-> GameMode 획득
-> RoundManager 획득
-> RoundManager->OnScoreChanged 바인딩

UMinimapWidget::BindRoundManager()
-> RoundManager->OnStageEnemySpawnerChanged 바인딩
-> 현재 스포너를 타겟으로 설정

미니맵

현재 라운드에서 사용하는 EnemySpawner의 범위를 기준으로 월드 좌표를 미니맵 좌표로 바꾼다.

UMinimapWidget::HandleStageEnemySpawnerChanged(...)
-> SetTargetSpawner(EnemySpawner)

UMinimapWidget::WorldToMinimapPosition(...)
UMinimapWidget::WorldToMinimapAreaPosition(...)

미니맵은 현재 스테이지 범위를 기준으로 다시 정규화해서 그린다.
라운드가 바뀌면 타겟 스포너가 바뀌고, 미니맵도 그 기준에 맞춰 다시 그려지는 방식이다.

발표 빌드

  • 플레이어 기본 이동과 방향 전환
  • 자동 공격과 무기 구조
  • 체력, 경험치, 레벨업 상태 축
  • HUD와 데미지 텍스트 연동
  • 라운드 단위 적 스폰과 점수 관리
  • 보스전 트리거와 카메라 잠금
  • 드롭 아이템과 무기 레벨링
  • 현재 스테이지 기준 미니맵 갱신

현재 빌드는 레벨 수를 늘리거나, 보스 패턴을 늘리거나, 무기 종류를 추가하는 작업은 전부 지금 만든 축 위에서 이어갈 수 있는 상태다.

스크린샷 2026-05-21 122557