개인프로젝트/IronBird

[IronBird #5] 보스 페이즈 + 적 3종류 + 충돌 시스템 구현

Client Side 2026. 5. 28. 20:09

IronBird 개발일지 #5

보스 페이즈 + 적 3종류 + 충돌 시스템 구현

EBossPhase · USphereComponent · FBX 콜리전 · 수동 물리 쿼리

🎯 목표

3페이즈 패턴 전환 보스와 3종류 적을 구현한다. 플레이어 체력 시스템과 HUD도 추가한다. FBX 메시 교체 과정에서 예상치 못한 콜리전 문제가 발생해 충돌 시스템을 전면 재설계했다.

AI로 클래스 구조 생성 → FBX 콜리전 문제 발견 → 직접 원인 분석 → USphereComponent로 재설계

🔧 구현 내용

항목 내용
적 3종류 TypeA 직선+발사 / TypeB 지그재그 / TypeC 느린하강+부채꼴
ABoss HP 50, EBossPhase 3단계, HomeX 사인 이동
플레이어 체력 MaxHP=3, 피격 2초 무적, TakeDamage 오버라이드
HUD DrawText 하트 3개 + 보스 체력바 (UMG 없이)
메시 교체 StarSparrow FBX (플레이어/적/보스 색상 구분)
플레이어 비행기
TypeA, TypeB, TypeC 적 비행기
보스 비행기

1. 보스 페이즈 상태머신

Behavior Tree 없이 HP 비율 기반 단순 상태머신으로 구현했다. 모바일에서 BT는 오버엔지니어링이다.

// HP 비율로 페이즈 전환
Phase1 (HP >60%): X 고정, Y 왕복 / 1.2초마다 직선탄 5발
Phase2 (HP >30%): X 사인이동, Y 왕복 / 0.9초마다 부채꼴 5발
Phase3 (HP ≤30%): 속도 1.5배 / 0.6초마다 전체 패턴

// HomeX 기반 사인 이동 (스폰 위치 중심으로 진동)
X = HomeX + FMath::Sin(Time) * 200.0f;

모바일 관점: Behavior Tree는 틱마다 태스크를 평가해 모바일에서 부담이 크다. 보스처럼 패턴이 명확한 경우 HP 비율 기반 상태머신이 훨씬 가볍고 예측 가능하다.

🔥 트러블슈팅

문제 1. FBX 메시 교체 후 모든 충돌이 동작하지 않음 (핵심)

원인: UE5에서 FBX 임포트 시 콜리전 Shape가 자동 생성되지 않는다. 기존 Cube 메시는 내장 BoxCollision이 있어서 동작했지만, StarSparrow FBX는 물리 바디가 없어 모든 충돌이 불가능했다.

해결: MeshComponent의 콜리전을 비활성화하고 USphereComponent를 별도로 추가해 hitbox를 명시적으로 구성했다.

// MeshComponent는 비주얼 전용
MeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);

// 명시적 hitbox 추가
HitSphere = CreateDefaultSubobject<USphereComponent>(TEXT("HitSphere"));
HitSphere->SetupAttachment(RootComponent);
HitSphere->SetSphereRadius(80.0f);  // Enemy: 80 / Boss: 250 / Player: 70
HitSphere->SetCollisionObjectType(ECC_Pawn);
HitSphere->SetGenerateOverlapEvents(true);

문제 2. QueryOnly 컴포넌트 간 Overlap 이벤트 불안정

원인: UE5 Chaos 물리에서 QueryOnly 설정된 컴포넌트끼리는 OnComponentBeginOverlap 이벤트가 간헐적으로 발생하지 않는 경우가 있다.

해결: Bullet Tick에서 OverlapMultiByObjectType으로 직접 물리 쿼리를 실행했다.

// 이벤트 방식 대신 직접 쿼리
TArray<FOverlapResult> Overlaps;
FCollisionObjectQueryParams ObjParams(ECC_Pawn);
GetWorld()->OverlapMultiByObjectType(
    Overlaps, GetActorLocation(), FQuat::Identity,
    ObjParams, FCollisionShape::MakeSphere(50.0f), QueryParams
);

모바일 관점: Bullet Tick마다 물리 쿼리를 실행하므로 총알 수가 많을수록 비용이 증가한다. 현재 Object Pool로 최대 30개로 제한돼 있어 허용 범위지만, 탄막 슈팅이라면 LineTrace 기반이 더 효율적이다.

문제 3. FBX 메시 방향이 탑뷰 기준과 불일치

원인: FBX 모델의 전면 방향이 UE5 좌표계 기준과 달라 탑뷰에서 옆을 향하게 됐다.

해결: 에디터에서 직접 확인하며 SetRelativeRotation 값을 맞췄다.

플레이어: FRotator(0, -90, 90)
적/보스: FRotator(0, 90, 90)

💡 배운 것

• FBX 임포트 메시는 콜리전이 없다. 항상 USphereComponent 또는 UCapsuleComponent로 별도 hitbox를 구성해야 한다.

• MeshComponent는 비주얼 전용, Collision 전용 컴포넌트를 분리하는 것이 명확한 설계다.

• UE5 Chaos에서 QueryOnly 컴포넌트 간 Overlap 이벤트는 불안정할 수 있다. 중요한 충돌은 직접 물리 쿼리로 처리하는 것이 안정적이다.

• 보스 AI는 BT 없이 HP 비율 기반 상태머신으로 충분하다. 모바일에서 BT는 불필요한 오버헤드다.

• FBX 좌표계는 엔진마다 다르다. 임포트 후 항상 에디터에서 방향을 직접 확인해야 한다.

📌 다음 작업

[IronBird #6] 메인화면 + 게임오버 + 점수 시스템 + 회복아이템 + BGM + 이펙트 + 효과음

적 처치 시 100점, 게임오버/클리어 시 점수 표시, 메인화면 레벨 분리.