인프런 [이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템] 강의 공부 노트
~이번 강의의 내용~
ASC의 생성과 초기화
GA의 제작과 활용
Tag의 활용
1. GAS를 사용한 구현 방법
→ C++로만 모든 기능 구현 가능, Actor로부터 기능 분리 장점
1) 어빌리티 발동 준비
ASC (AbilitySystemComponent) 선언
액터들의 중앙처리장치 ASC를 통해 GA발동 가능, 부착한 액터끼리 GAS 상호작용 가능
- 액터에 ASC 상속받아 생성
- InitAbilityActorInfo(실제 작업_데이터 변동이 일어나고 있는 액터 정보, 비주얼 작업_동작만 수행하는 아바타 액터)
ASC 선언
- 액터에 단 1개 부착 가능
- GAS를 관리하는 핵심 컴포넌트
GA (Gameplay Ability) 생성
ASC에 등록되어 발동 가능한 액션 명령
발동 과정
- ASC에 어빌리티 등록 : ASC의 GiveAbility함수에 발동할 GA 타입(GameplayAbilitySpec) 전달
- ASC에 어빌리티 발동 명령 : ASC의 TryActivateAbility함수에 발동할 GameplayAbilitySpec 전달, 등록된 타입이면 GA의 인스턴스 생성.
- 발동된 GA에 발동한 액터와 실행 정보 기록됨.
ActorInfo : 어빌리티의 소유자와 아바타 정보
ActivationInfo : 발동 방식에 대한 정보
SpecHandle : 발동된 어빌리티에 대한 핸들
주요 함수 : CanActivateAbility, ActivateAbility, CancelAbility, EndAbility
GA 생성
- GameAbility를 상속받는 C++ 클래스 생성
- 주요 함수인 ActivateAbility, CancelAbility 오버라이드
- ActivateAbility의 인자인 ActorInfo에서 아바타 액터를 가져오는 것이 일반적. 가져와 Activate 해줌.
→ ASC에 GiveAbility(GameAbilitySpec)를 통하여 생성한 GA 부여로 어빌리티 발동 준비 완료.
2) 어빌리티 발동
발동할 함수 내부
- ASC→FindAbilitySpecFromClass(GA 클래스)를 통하여 발동할 GA 클래스의 포인터 가져오기
- Spec 활성화
- 검사활성화 상태라면 취소 : ASC→CancelAbilityHandle(Spec→Handle)로 취소
- 비활성화 상태라면 활성화 : ASC→TryActiveAbility(Spec→Handle)로 활성화
2. Gameplay Tag를 추가하여 사용한 방법
→ 의존성 없는 설계, 어빌리티 교체가 가능한 유연한 확장성이 장점
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/using-gameplay-tags-in-unreal-engine
Gameplay Tag는 FName으로 구성된 가벼운 계층적 데이터 라벨.
Project Settings에서 생성, 관리 가능.
공식 문서에서는 “Family.Genus.Species”를 통해 계층적 구조를 보여준다.
여기서 가장 넓은 식별자는 Family로 Family> Genus> Species로 과> 속>종과 같은 계층적 구조를 보여준다.
GameplayTagContainer가 제공되어 Query를 통하여 다양한 연산이 가능하다.
GAS를 사용하지 않는 프로젝트에서도 유용하게 사용 가능!
Gameplay Tag를 Blueprint와 함께 사용하면, 특정 C++ 헤더에 대한 의존성을 없앨 수 있다.
사용하기
1.GA의 생성자에 Tag 등록하기
해당 어빌리티를 대표하는 Tag 등록하기
AbilityTags.AddTag(FGameplayTag::RequestGameplayTag(FName(””))
// FGameplayTag::RequestGameplayTag(FName(””)는 매크로로 지정하여 Tag관리하기.
활성화될 때 등록하는 Tag 등록하기 (보통 상태를 나타내는 Tag)
ActivationOwnedTags.AddTag(상태 태그)
// 임의 매크로 선언.
#define TESTTAG_ACTION FGameplayTag::RequestGameplayTag(FName(”태그”))
#define TESTTAG_STATE FGameplayTag::RequestGameplayTag(FName(”상태태그”))
// 생성자 내부.
AbilityTags.AddTag(TESTTAG_ACTION);
ActivationOwnedTags.AddTag(TESTTAG_STATE);
2. 발동시킬 ASC를 가진 액터의 함수에서 사용
FGameplayTagContainer TargetTag(태그)
태그 유무(어빌리티 활성화) 검사 ASC→HasMatchingGameplayTag(상태 태그)
비활성화라면 TryActivateAbilitiesByTag(TargetTag)로 태그를 검색하여 자동으로 활성화.
활성화라면 CancelAbilities로 비활성화.
// ASC를 가진 액터의 기능 함수 내부.
FGameplayTagContainer TargetTag(TESTTAG_ACTION);
// 태그의 존재는 어빌리티의 활성화 상태를 나타냄.
// 어빌리티 비활성화 상태.
if(!ASC->HasMatchingGameplayTag(TESTTAG_STATE))
{
// TargetTag를 검색하여 해당 어빌리티 자동으로 활성화.
ASC->TryActivateAbilitiesByTag(TargetTag);
}
// 어빌리티 활성화 상태.
else
{
// TargetTag로 어빌리티 비활성화.
ASC->CancelAbilities(TargetTag);
}
+시작 시 발동할 어빌리티들을 배열로 묶어 UPROPERTY로 선언하여 의존성 개선.
이 어빌리티들은 블루프린트로 관리.
TArray<TSubclassOf<class UGameplayAbility>> StartAbilities;
+공식 문서의 설명
액터의 소멸&리스폰 경우에는 컴포넌트를 플레이어 스테이트 같은 곳에 보관하는 것이 좋음.
'UnrealEngine5 > 공부' 카테고리의 다른 글
[UE5/GAS] 상태Tag와 AT를 활용한 GA, AT 규칙 (0) | 2025.05.29 |
---|---|
[UE5/GAS] GAS와 CharacterPlayer, GA와 AbilityTask (0) | 2025.05.28 |
[UE5/GAS] Game Ability System이란? (0) | 2025.05.26 |
[UE5] Transform Scale과 Shape Extent의 차이 (0) | 2025.04.16 |
[UE5] Dedicated server 전용 서버 독학하기 1) 공식 문서 튜토리얼 (0) | 2025.04.09 |