0. 개요
어빌리티를 액터가 사용하기 위해서는 해당 어빌리티를 서버에서 클라이언트로 부여(Granting)하여야 한다.
1. 게임플레이 어빌리티
(1) 게임플레이 어빌리티 배열 - AuraCharacterBase
각 액터가 사용할 수 있는 게임플레이 어빌리티를 배열의 형태로 저장할 것이다.
또한 해당 어빌리티는 에디터에서 변경할 수 있도록 TSubClassOf 함수를 사용한다.
protected:
// 캐릭터에 어빌리티 부여
void AddCharacterAbilites();
private:
// 시작 시 활성화되는 어빌리티
UPROPERTY(EditAnywhere, Category="Abilities")
TArray<TSubclassOf<UGameplayAbility>> StartupAbilities;
void AAuraCharacterBase::AddCharacterAbilites()
{
// 이 함수를 실행하는 주체가 서버인지 확인
if (!HasAuthority())
return;
}
캐릭터에 어빌리티를 부여하는 함수에는 HasAuthority 함수를 사용하여 서버가 맞는지 확인한다.
(2) 게임 시작 시 어빌리티 부여하기 - AuraAbilitySystemComponent
게임이 시작될 때 캐릭터가 사용할 수 있는 어빌리티를 부여한다.
(2-1) GiveAbility 함수
void UAuraAbilitySystemComponent::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
for (TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities)
{
// 게임플레이 어빌리티 스펙 생성
const FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
// 어빌리티 부여
GiveAbility(AbilitySpec);
}
}
어빌리티를 액터에 부여할 때 사용한다.
이 함수를 사용하기 위해서는 FGameplayAbilitySpec이 필요하다.
(2-2) GiveAbilityAndActivateOnce 함수
void UAuraAbilitySystemComponent::AddCharacterAbilities(const TArray<TSubclassOf<UGameplayAbility>>& StartupAbilities)
{
for (TSubclassOf<UGameplayAbility> AbilityClass : StartupAbilities)
{
// 게임플레이 어빌리티 스펙 생성
FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
// 어빌리티 부여 후 한 번만 활성화
GiveAbilityAndActivateOnce(AbilitySpec);
}
}
어빌리티를 액터에 부여하고 한 번만 활성화한다.
이 함수를 사용하기 위해서는 const가 아닌(Non-const) FGameplayAbilitySpec이 필요하다.
또한 게임플레이 이벤트를 적용하여 특정 이벤트가 발생했을 때 발동이 가능하다.
최초에 부여받은 어빌리티를 즉시 활성화하기 위해 이 함수를 사용하도록 하겠다.
(3) 캐릭터 부모의 어빌리티 부여 함수 - AuraCharacterBase
각 캐릭터(플레이어 캐릭터 및 몬스터)는 게임이 초기화 됨과 동시에 어떤 어빌리티를 가진다.
해당 어빌리티들을 배열로 저장한 것이 StartupAbilities이며 최상위 부모 클래스(AuraChacracterBase)의 멤버 변수로 저장되어있다.
void AAuraCharacterBase::AddCharacterAbilites()
{
UAuraAbilitySystemComponent* AuraASC = CastChecked<UAuraAbilitySystemComponent>(AbilitySystemComponent);
// 이 함수를 실행하는 주체가 서버인지 확인
if (!HasAuthority())
return;
AuraASC->AddCharacterAbilities(StartupAbilities);
}
(2)번에서 정의한 AddCharacterAbilities 함수에 액터의 StartupAbilities 배열을 전달하여 어빌리티 시스템 컴포넌트의 GiveAbility 함수를 호출하게 된다.
(4) 어빌리티 추가 시점 - AuraCharacter
이제 게임 초기화 이후 액터에 컨트롤러가 빙의할 때 AddCharacterAbilities 함수를 호출하게 한다.
void AAuraCharacter::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
// 서버를 위해 어빌리티 액터 정보 초기화
InitAbilityActorInfo();
// 캐릭터 별 초기 능력(Ability) 부여
AddCharacterAbilites();
}
2. 게임플레이 어빌리티 블루프린트
(1) 블루프린트 생성
AuraGameplayAbility를 상속받는 블루프린트를 생성한다.
GameplayAbility는 ActivateAbility 이벤트 노드와 OnEndAbility 이벤트 노드를 사용한다.
End Ability 노드를 이용하여 OnEndAbility 이벤트를 호출하게 된다.
어빌리티 활성화 로직은 다음과 같다.
1. 컨트롤러가 캐릭터에 빙의
2. 어빌리티 부여
- 부여 주체가 서버인지 확인
3. 블루프린트에 설정된 게임플레이 어빌리티 클래스를 부여
- ASC에서 인수로 받은 StartupAbilites를 순회하여 GiveAbilityAndActivateOnce 함수를 발동
- 호출 스택
1. AAuraCharacter::PossessedBy
2. AAuraCharacterBase::AddCharacterAbilites
3. UAuraAbilitySystemComponent::AddCharacterAbilities
4. UAbilitySystemComponent::GiveAbilityAndActivateOnce
(2) 캐릭터에 초기 어빌리티 설정(BP_AuraCharacter)
Aura Character의 블루프린트에서 테스트용 어빌리티를 추가한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
8-4. 입력 - (1) 입력 설정 데이터 에셋(Input Config Data Asset) (0) | 2024.12.03 |
---|---|
8-3. 게임플레이 어빌리티 - (2) 어빌리티 설정(Settings on Gameplay Ability) (0) | 2024.12.03 |
8-1. 게임플레이 어빌리티(Gameplay Ability) (0) | 2024.10.31 |
7-11. 속성 메뉴 UI - (7) 속성 값 변화 델리게이트, 2차 속성 매핑 (0) | 2024.10.23 |
7-10. 속성 메뉴 UI - (6) 속성 메뉴 내 행에 속성 값 표시하기, 함수 포인터(Functor) (0) | 2024.10.07 |