PART 4 - 강의 1/4
Instancing Policy
어빌리티 인스턴스 생성 전략
01
세 가지 인스턴싱 정책
메모리와 기능 사이의 트레이드오프
EGameplayAbilityInstancingPolicy
UENUM()
enum class EGameplayAbilityInstancingPolicy : uint8
{
// 클래스당 하나의 인스턴스, 모든 실행에서 공유
// 가장 가벼움, 상태 저장 주의 필요
NonInstanced,
// Actor당 하나의 인스턴스 (가장 일반적)
// 부여(Grant)될 때 인스턴스 생성
InstancedPerActor,
// 실행당 인스턴스 생성, 종료 시 파괴
// 가장 무거움, 동시 실행 가능
InstancedPerExecution
};
| 정책 | 메모리 | 상태 저장 | 동시 실행 |
|---|---|---|---|
| NonInstanced | 최소 | 불가 | 불가 |
| InstancedPerActor | 중간 | Actor당 | 불가 |
| InstancedPerExecution | 최대 | 실행당 | 가능 |
02
NonInstanced
가볍지만 제한적
NonInstanced 어빌리티
UCLASS()
class UNonInstancedAbility : public UGameplayAbility
{
GENERATED_BODY()
public:
UNonInstancedAbility()
{
InstancingPolicy = EGameplayAbilityInstancingPolicy::NonInstanced;
}
// 주의: 인스턴스 변수 사용 불가!
// 모든 Actor가 같은 인스턴스 공유
// UPROPERTY() int32 ComboCount; // 이렇게 하면 안 됨!
};
// 적합한 사용 사례:
// - 점프
// - 기본 공격 (상태 없는)
// - 간단한 버프 토글
상태 저장 불가
NonInstanced에서 멤버 변수를 사용하면 모든 Actor가 같은 값을 공유합니다. 상태가 필요하면 InstancedPerActor를 사용하세요.
03
InstancedPerActor
가장 일반적인 선택
InstancedPerActor 어빌리티
UCLASS()
class UInstancedPerActorAbility : public UGameplayAbility
{
GENERATED_BODY()
public:
UInstancedPerActorAbility()
{
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
}
protected:
// Actor당 개별 상태 저장 가능
UPROPERTY()
int32 ComboCount;
UPROPERTY()
float ChargeTime;
UPROPERTY()
bool bIsChanneling;
};
// 적합한 사용 사례:
// - 콤보 공격 (ComboCount 저장)
// - 차징 스킬 (ChargeTime 저장)
// - 채널링 스킬
// - 대부분의 게임 어빌리티
04
InstancedPerExecution
동시 실행이 필요할 때
InstancedPerExecution 어빌리티
UCLASS()
class UInstancedPerExecutionAbility : public UGameplayAbility
{
GENERATED_BODY()
public:
UInstancedPerExecutionAbility()
{
InstancingPolicy =
EGameplayAbilityInstancingPolicy::InstancedPerExecution;
}
protected:
// 실행마다 독립적인 상태
UPROPERTY()
AActor* CurrentTarget;
UPROPERTY()
FVector LaunchDirection;
};
// 적합한 사용 사례:
// - 소환수가 각각 다른 타겟에게 사용하는 어빌리티
// - 여러 발사체를 동시에 유도하는 스킬
// - 같은 어빌리티를 여러 번 동시 활성화해야 할 때
// 주의: 메모리 사용량 증가, 신중히 사용
선택 가이드
90% 이상의 어빌리티는 InstancedPerActor로 충분합니다. 동시 실행이 반드시 필요한 경우에만 InstancedPerExecution을 사용하세요.
SUMMARY
핵심 요약
- NonInstanced: 상태 없는 간단한 어빌리티 (점프, 기본 공격)
- InstancedPerActor: 대부분의 어빌리티에 권장 (콤보, 차징)
- InstancedPerExecution: 동시 실행 필요 시 (소환수 스킬)
- 기본값은 InstancedPerActor로 시작하고, 필요 시 변경
PRACTICE
도전 과제
배운 내용을 직접 실습해보세요
실습 1: Instancing Policy 비교
NonInstanced, InstancedPerActor, InstancedPerExecution 각각의 어빌리티를 만들고 로그로 인스턴스 수를 확인하세요. 메모리 사용량 차이를 stat obj로 비교하세요.
실습 2: 어빌리티 인스턴스 변수 관리
InstancedPerActor 어빌리티에서 멤버 변수로 콤보 카운터를 관리하세요. NonInstanced에서는 동일한 로직을 AbilitySpec의 GameplayEffectSpec으로 구현하세요.
심화 과제
undefined