TIL — Unreal Engine 데미지 계산 구조와 Cast 학습
1. WorldSubsystem을 이용한 데미지 계산 분리
오늘 코드 분석을 통해 데미지 계산을 특정 스킬이나 캐릭터 클래스 내부에서 직접 처리하지 않고, 별도의 Subsystem으로 분리하는 구조를 학습했습니다.
UDamageCalculator* DamageCalculator = World->GetSubsystem<UDamageCalculator>();
이 코드는 현재 World에 등록된 UDamageCalculator를 가져오는 코드입니다.
전체적인 흐름은 다음과 같습니다.
스킬
↓
UDamageCalculator
↓
공격력, 방어력 등의 정보 계산
↓
최종 데미지 결정
GetSubsystem의 역할
World->GetSubsystem<UDamageCalculator>()
는 UWorldSubsystem으로 만들어진 UDamageCalculator를 가져옵니다.
즉, 스킬 클래스가 직접 다음과 같은 계산을 하는 대신:
최종 데미지 = 공격력 - 방어력
각 스킬은 데미지 계산 시스템에 필요한 정보를 전달하고, 실제 계산은 UDamageCalculator가 담당하도록 분리할 수 있습니다.
학습한 구조
[스킬]
↓
피해량 전달
[DamageCalculator Subsystem]
↓
방어력 확인
공격력 계산
버프/디버프 적용
↓
최종 피해량 반환
이러한 구조는 데미지 계산 로직이 여러 스킬에 중복되는 것을 방지하고, 나중에 데미지 계산 규칙을 변경할 때도 한 곳만 수정할 수 있다는 장점이 있습니다.
2. AController를 가져오는 과정
다음 코드도 분석했습니다.
AController* InstigatorController = nullptr;
if (APawn* OwnerPawn = Cast<APawn>(OwnerActor))
{
InstigatorController = OwnerPawn->GetController();
}
이 코드의 흐름은 다음과 같습니다.
OwnerActor
↓
APawn인지 확인
↓
APawn*으로 변환
↓
GetController()
↓
AController 가져오기
3. Cast의 역할
Cast<APawn>(OwnerActor)
는 OwnerActor가 실제로 APawn인지 확인하고, 맞다면 APawn*으로 변환하는 함수입니다.
예를 들어:
AActor* OwnerActor;
라는 변수는 AActor 타입이기 때문에 바로:
OwnerActor->GetController();
를 사용할 수 없습니다.
AActor에는 GetController()가 없기 때문입니다.
따라서 먼저:
APawn* OwnerPawn = Cast<APawn>(OwnerActor);
처럼 APawn으로 변환해야 합니다.
4. 왜 if문 안에서 Cast를 사용하는가?
if (APawn* OwnerPawn = Cast<APawn>(OwnerActor))
{
InstigatorController = OwnerPawn->GetController();
}
여기서 Cast에 실패하면:
OwnerPawn == nullptr
이 됩니다.
따라서 if문은 다음과 같은 의미를 가집니다.
OwnerActor를 APawn으로 변환
↓
성공했는가?
↓
성공 → if문 실행
실패 → if문 실행하지 않음
즉, 잘못된 타입을 강제로 사용해서 발생할 수 있는 오류를 방지하는 코드입니다.
5. 오늘 학습한 코드 패턴
오늘 가장 중요한 코딩 패턴은 다음 두 가지입니다.
① Subsystem을 통한 책임 분리
UDamageCalculator* DamageCalculator =
World->GetSubsystem<UDamageCalculator>();
현재 객체가 모든 기능을 직접 처리하지 않는다.
↓
전문적인 시스템에게 작업을 맡긴다.
② Cast를 이용한 안전한 타입 변환
if (APawn* OwnerPawn = Cast<APawn>(OwnerActor))
{
...
}
기존 타입
↓
원하는 타입인지 확인
↓
성공했을 때만 해당 타입의 기능 사용
오늘의 핵심 정리
Subsystem은 여러 시스템에서 공통으로 사용하는 기능을 중앙에서 관리하기 위한 구조이고, Cast는 객체가 원하는 타입인지 확인한 뒤 안전하게 해당 타입으로 변환하는 기능이다.
오늘 분석한 데미지 코드에서는 Subsystem을 통해 데미지 계산의 책임을 분리하고, Cast<APawn>을 통해 공격 주체의 Controller를 안전하게 가져오는 방식을 학습했다.
'내일배움캠프_언리얼9기' 카테고리의 다른 글
| 내일배움캠프 63일차 TIL 2026/07/22 (0) | 2026.07.22 |
|---|---|
| 내일배움캠프 61일차 TIL 2026/07/20 (0) | 2026.07.20 |
| 내일배움캠프 59일차 TIL 2026/07/15 (0) | 2026.07.15 |
| 내일배움캠프 58일차 TIL 2026/07/14 (0) | 2026.07.14 |
| 내일배움캠프 56일차 TIL 2026/07/10 (0) | 2026.07.10 |