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