Unreal 개발 본캠프 53일차

HappyCircle·2026년 2월 12일

Unreal 개발

목록 보기
70/163

📘 TIL – Monster Wave Spawner – 경로 및 스폰 위치 지정 구현


🧠 오늘의 이슈

  • 레인 기반 스폰 위치 분리
  • 경로 포인트 관리 체계화
  • Spawner와 Path 시스템 분리
  • 몬스터 이동 초기화 안정화

1️⃣ 기존 구조의 한계

기존에는:

  • 몬스터를 특정 위치에서 Spawn
  • AI가 Warehouse를 향해 MoveTo
  • NavMesh 기반 경로 탐색

문제:

  • 레인 개념이 코드 레벨에서 명확하지 않음
  • 스폰 위치와 이동 경로가 느슨하게 연결
  • 추후 레인별 패턴 확장 어려움

2️⃣ 설계 목표

  1. 레인을 명확한 “데이터 단위”로 관리
  2. 스폰 위치와 경로 포인트를 연결
  3. Spawner는 “경로를 모르는” 구조 유지
  4. Monster는 “자기 레인 정보”를 보관

3️⃣ 전체 구조


BP_LanePathManager
↓
Spawner
↓
Monster
↓
AIController
↓
BehaviorTree

4️⃣ LanePathManager 설계

🎯 역할

  • 레인별 경로 포인트 관리
  • 레인별 스폰 위치 제공
  • 중앙화된 경로 데이터 관리자

📌 구조 예시

레인 구분 Enum

UENUM(BlueprintType)
enum class ELaneType : uint8
{
    Left,
    Mid,
    Right
};

경로 저장 구조

UPROPERTY(EditAnywhere)
TArray<AActor*> LeftLanePoints;

UPROPERTY(EditAnywhere)
TArray<AActor*> MidLanePoints;

UPROPERTY(EditAnywhere)
TArray<AActor*> RightLanePoints;

각 LanePoint는 월드에 배치된 TargetPoint.


5️⃣ Spawner – 레인 기반 스폰

🎯 목표

  • Wave 데이터에서 레인 정보 확인
  • 해당 레인의 스폰 위치 가져오기
  • Monster에 레인 정보 주입

📌 흐름

ELaneType SpawnLane = WaveData.LaneType;

FVector SpawnLocation = LaneManager->GetSpawnLocation(SpawnLane);

APotatoMonster* Monster = GetWorld()->SpawnActor<APotatoMonster>(...);

Monster->InitLane(SpawnLane);

🔥 핵심 포인트

Spawner는:

  • “어느 레인에 스폰할지”만 결정
  • 실제 경로 포인트는 LaneManager가 관리

6️⃣ Monster – 레인 정보 보관

UPROPERTY()
ELaneType CurrentLane;

Monster는:

  • 자기 레인 저장
  • 초기 MoveTarget 설정
  • Lane 인덱스 관리

7️⃣ AIController – 초기 Blackboard 설정

OnPossess 시:

Blackboard->SetValueAsEnum("LaneType", (uint8)Monster->CurrentLane);
Blackboard->SetValueAsInt("LaneIndex", 0);

8️⃣ BehaviorTree – 레인 경로 이동

📌 이동 방식

  1. 현재 LaneIndex 확인
  2. 해당 LanePoints[LaneIndex] 가져오기
  3. MoveTo 실행
  4. 도착 시 LaneIndex++

AdvanceLaneTarget Task 개념

LaneIndex++;
NextTarget = LanePoints[LaneIndex];
Blackboard->SetValueAsObject("MoveTarget", NextTarget);

9️⃣ 구조적 장점

🔹 경로 시각화 용이

LanePoint를 월드에 배치하므로:

  • 코드 수정 없이 경로 변경

🔹 AI와 경로 완전 분리

AI는:

  • “다음 목표 지점으로 이동”만 수행

경로 구조는:

  • LaneManager가 전담

스폰 위치 전략

📌 스폰 위치 옵션

  1. 레인 시작 지점 고정

예시

FVector SpawnLoc = BaseSpawnLoc;
SpawnLoc += FVector(0, FMath::RandRange(-100, 100), 0);

확장 가능 시나리오

  • 특정 웨이브에서 레인 봉쇄
  • 레인별 이동 속도 차이

오늘의 설계 요약

  1. 경로는 데이터로 관리한다.
  2. Spawner는 경로 구조를 모른다.
  3. Monster는 자기 상태만 가진다.
  4. AI는 단순 실행자다.

🎯 최종 구조 요약

Wave Data
   ↓
Spawner (Lane 결정)
   ↓
LaneManager (Spawn 위치 + Path 제공)
   ↓
Monster (Lane 저장)
   ↓
AIController (Blackboard 설정)
   ↓
BehaviorTree (MoveTo 반복)

profile
개발합시다!

0개의 댓글