내배캠 TIL

[내배캠 TIL 260417] Unreal RTS 영웅 스킬 구조 설계 (다형성 + 타이머 기반 판정)

xodn246 2026. 4. 17. 21:17

1. 유닛 & 컨트롤러 구조 (다형성 설계)

핵심은 컨트롤러는 유닛의 "종류"를 몰라도 된다는 것.

구조

  • 부모 클래스: ATWHeroUnitBase
  • 자식 클래스: 투사체형 / 범위형 등

설계 방식

 
class ATWHeroUnitBase : public AActor
{
public:
    virtual void UseSkill(FVector TargetLocation);
    virtual bool IsIndicatorRequired() const;
};
ATWHeroUnitBase* Hero = Cast<ATWHeroUnitBase>(SelectedUnit);
Hero->UseSkill(ClickLocation);

포인트

  • 컨트롤러에 분기 없음 (if/switch 제거)
  • 새로운 영웅 추가 → 컨트롤러 수정 없음
  • 완전한 다형성 구조

신호등 함수 (Indicator 분기 제거)

if (Hero->IsIndicatorRequired())
{
    ShowIndicator();
}
 
  • 유닛이 “내가 타게팅 필요한지” 직접 판단
  • 컨트롤러 책임 ↓
  • 확장성 ↑

2. 스킬 로직 vs 연출 분리

문제

  • 매번 액터 Spawn → 비용 큼 / 관리 어려움

해결

  • 로직: 타이머
  • 연출: Debug Draw (임시)

데이터 기반 설계

 
USTRUCT()
struct FHeroData
{
    TSubclassOf<AActor> SkillAreaClass;
};
  • 스킬 정보는 DataTable에서 관리
  • 코드 수정 없이 확장 가능

3. 시간차 스킬 구조 (타이머)

구조

  1. 예고 (충전)
  2. 폭발 (판정)
  3. 여운 (이펙트)

코드

// 1. 예고
DrawDebugCircle(GetWorld(), Loc, Radius, 50, FColor::Green, false, 3.0f);

// 2. 폭발 예약
GetWorldTimerManager().SetTimer(TimerHandle, [this, Loc]()
{
    // 실제 판정 위치 유지됨 (람다 캡처)
    
    // TODO: 데미지 처리
    DrawDebugCircle(GetWorld(), Loc, Radius, 50, FColor::Red, false, 1.0f);

}, 3.0f, false);

핵심 포인트

  • [this, Loc] 캡처 → 클릭 당시 위치 유지
  • 액터 없이도 스킬 흐름 구현 가능
  • 상태 머신 없이 간단하게 시퀀스 구성

4. DrawDebugCircle 핵심

DrawDebugCircle(
    GetWorld(),
    Loc,
    Radius,
    50,
    FColor::Green,
    false,
    3.0f,
    0,
    2.0f,
    FVector(0, 0, 1) // 중요
);

중요 파라미터

  • Normal: (0,0,1) → 바닥 기준 원
  • Segments: 32~50 → 원 부드러움
  • LifeTime:
    • -1 → 1프레임
    • 0 → 유지 시간

트러블슈팅

  • 원이 선처럼 보임 → Normal 값 문제 100%

5. 현재 구조의 장점

  • 컨트롤러 수정 없이 영웅 추가 가능
  • 스킬 흐름을 타이머로 단순화
  • 초기 단계에서 빠른 검증 가능
  • 불필요한 Spawn 제거 → 성능 + 개발 속도 확보

6. 다음 단계 (실전 로직)

 
TArray<AActor*> HitActors;

UKismetSystemLibrary::SphereOverlapActors(
    GetWorld(),
    Loc,
    Radius,
    ObjectTypes,
    AMonster::StaticClass(),
    IgnoreActors,
    HitActors
);
  • 태그 기반 필터링
  • 실제 데미지 적용
  • 팀 판정 추가 필요