본문으로 건너뛰기
Unreal Engine GAS(Gameplay Ability System) 심화LESSON 16

Ability 부여·제거·레벨 관리 구조

난이도심화
예상 시간145분
선수지식15강의 Ability 인스턴스 정책

16강. Ability 부여·제거·레벨 관리 구조

1. 이번 강의에서 해결할 문제​

Client가 Ability를 직접 Give하거나 Respawn마다 같은 Ability를 다시 지급하면 Spec 중복과 입력 중복이 생깁니다. 제거할 때 클래스만 검색하면 장비·레벨별로 지급된 정확한 Spec을 회수하기 어렵습니다.

2. 학습 목표​

3. 핵심 개념​

GiveAbility와 ClearAbility는 Authority에서 수행합니다. FGameplayAbilitySpecHandle은 정확한 지급 인스턴스를 가리킵니다. 장비나 Ability Set이 지급한 Handle 목록을 소유하고 해제 때 회수해야 합니다.

4. 구현​

GASAbilityGrant.cpp
FGameplayAbilitySpecHandle GrantAbility(
UAbilitySystemComponent* ASC,
TSubclassOf<UGameplayAbility> AbilityClass,
int32 Level,
UObject* SourceObject)
{
if (!ASC || !ASC->IsOwnerActorAuthoritative() || !AbilityClass)
return {};

FGameplayAbilitySpec Spec(AbilityClass, FMath::Max(Level, 1));
Spec.SourceObject = SourceObject;
return ASC->GiveAbility(Spec);
}

void RemoveGrantedAbilities(
UAbilitySystemComponent* ASC,
TArray<FGameplayAbilitySpecHandle>& Handles)
{
if (!ASC || !ASC->IsOwnerActorAuthoritative()) return;
for (const FGameplayAbilitySpecHandle& Handle : Handles)
ASC->ClearAbility(Handle);
Handles.Reset();
}

레벨을 직접 수정한 Spec은 ASC Ability List Lock 안에서 찾고 MarkAbilitySpecDirty를 호출해야 복제 대상 변경이 반영됩니다. API와 잠금 방식은 현재 엔진 Header를 확인합니다.

5. 코드가 동작하는 이유​

서버가 만든 Spec이 ASC의 권한 목록 원본이 되고 Client에는 필요한 활성화 정보가 복제됩니다. Handle 목록이 지급 소유권을 표현하므로 장비 해제·Class 변경·Respawn에서 정확한 Spec만 제거할 수 있습니다.

6. 실패 사례와 해결​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

Ability 부여·제거·레벨 관리 구조 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Ability 부여·제거·레벨 관리 구조” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2“Ability 부여·제거·레벨 관리 구조” 실습 중 ‘Client에서 GiveAbility’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

16강. Ability 부여·제거·레벨 관리 구조 미완료 상태