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)와 사운드가 자동으로 반응하도록 결합도를 낮출 예정임.

'언리얼엔진5 공부' 카테고리의 다른 글
| 2026-03-11 TIL (0) | 2026.03.11 |
|---|---|
| [TIL] UE5 나이아가라 잔상 시스템 및 AI 협동 분신 구현 (0) | 2026.03.08 |
| [TIL] UE 5 스킬 시스템 핵심 로직 - 스왑 및 장착 메커니즘 (0) | 2026.02.10 |
| [TIL] UE5 콜리젼 & 오버랩 초기화 순서에 따른 이슈 (0) | 2026.02.09 |
| [TIL] UE5 컴포넌트 기반 스킬/아이템 슬롯 시스템 설계 및 구현 (1) | 2026.02.05 |