언리얼엔진5 공부

[TIL]UE 5 '신의 심판' 스킬 시스템 구현

Client Side 2026. 2. 20. 21:29

1. 작업 개요

  • 목표: 광역 범위 내 적에게 순차적/동시적 대미지를 입히는 액티브 스킬 '신의 심판' 구현.
  • 핵심 기술: C++, Overlap Multi, Timer Manager, UE Reflection (UPROPERTY/UFUNCTION).

2. 주요 구현 내용 및 기술적 의사결정

✅ 언리얼 엔진 코딩 표준 준수

  • 모든 변수와 클래스 명명 규칙을 엄격히 준수함.
    • bIsCasting: Boolean 접두사 b 사용.
    • ASkillActor: Actor 클래스 접두사 A 사용.
    • PascalCase: 멤버 변수 및 함수명에 파스칼 케이스 적용.

✅ 성능 최적화를 위한 설계

  • Tick() 사용 지양: 매 프레임 검사하는 Tick 대신, 특정 시점에만 충돌을 검사하는 GetWorld()->OverlapMultiByChannel 방식 채택.
  • TimerManager 활용: 스킬의 지연 실행이나 지속 대미지 로직에서 SetTimer를 사용하여 CPU 자원 낭비 최소화.

✅ 안정성 및 유지보수성 (Defensive Programming)

  • 포인터 검증: 모든 포인터 사용 전 if (Ptr) 또는 IsValid(Ptr)를 통한 유효성 검사 수행.
  • Cast<T> 안정성: Cast<T> 사용 시 실패 가능성을 염두에 둔 방어적 코드 작성.
  • Reflection 활용: 스킬의 대미지, 범위 등을 EditAnywhere 스펙시파이어로 선언하여 기획 단계에서 데이터 수정이 용이하도록 설계.

3. 핵심 코드 (Snippet)

C++
 
// 스킬 실행 핵심 로직 (예시)
void ASkillJudgment::ApplySkillDamage()
{
    FVector SkillLocation = GetActorLocation();
    TArray<FOverlapResult> OutOverlapResults;
    FCollisionQueryParams Params;
    Params.AddIgnoredActor(this);
    Params.AddIgnoredActor(GetOwner());

    // 범위 내 타겟 검출
    bool bHasHit = GetWorld()->OverlapMultiByChannel(
        OutOverlapResults,
        SkillLocation,
        FQuat::Identity,
        ECC_GameTraceChannel1, // Enemy 채널
        FCollisionShape::MakeSphere(SkillRadius),
        Params
    );

    if (bHasHit)
    {
        for (const FOverlapResult& Result : OutOverlapResults)
        {
            AActor* HitActor = Result.GetActor();
            if (HitActor)
            {
                // 대미지 로직 및 로그 출력
                UGameplayStatics::ApplyDamage(HitActor, SkillDamage, GetInstigatorController(), this, UDamageType::StaticClass());
                UE_LOG(LogTemp, Log, TEXT("Divine Judgment hit: %s"), *HitActor->GetName());
            }
        }
    }
}

4. 고찰 및 개선 방향

  • 문제 해결: 초기 구현 시 발생했던 Null Reference 문제를 IsValid() 체크와 check() 매크로를 적재적소에 배치함으로써 해결함.
  • 향후 계획: 현재는 단일 타격 방식이나, 향후 Delegate 기반의 이벤트 시스템을 도입하여 스킬 발동 시 이펙트(Niagara)와 사운드가 자동으로 반응하도록 결합도를 낮출 예정임.