GAS -> 개념 정리 ( 1 )

2025. 9. 17. 20:40언리얼 개념 정리

GameAbility System  ->  RPG나 MOBA 타이틀에서 볼 수 있는 유형의 능력과 속성을 구축하기 위한 매우 유연한 프레임 워크 

GAS기능들

  • 레벨 기반 캐릭터의 어빌리티 또는 코스트와 쿨타임이 존재하는 스킬 구현(GameplayAbility)
  • 액터에 속하는 속성 수치 조작(Attribute)
  • 액터에게 상태 효과 적용(GameplayEffect)
  • 액터에게 태그 적용(GameplayTag)
  • 시각 효과, 사운드 효과 적용(GameplayCue)
  • 위에서 언급된 모든 요소들의 복제(Replication)

멀티플레이 게임에서 Gas는 클라이언트 예측을 지원한다 

==예측 리스트 ==

  • Ability 활성화
  • 애니메이션 몽타주 재생
  • Attribute 변경
  • GameplayTag 적용
  • GameplayCue 스폰
  • CharacterMovementComponent에 연결된 루트 모션 소스 함수를 통한 움직임

ASC - > 어빌리티 시스템 컴포넌트 시스템과의 모든 상호 작용을 처리하는 액터 컴포넌트이다 GameplayAbility 사용 , Attribute를 가지던가 GameplayEffect받을려면 반드시 액터에 붙여있어야한다

ASC->가 붙은 액터를 OwnerActor , 물리적 표현 액터를 AvactarActor

보통 미니언같이 ai는 둘다 같은데 PlayerCharacter와 같이 능력치가 계속 유지되어야하는 경우 PlayerState클래스가 OwnerActor가 되는게 이상적인구조이다 ( ASC가 PlayerState에 있는 경우, PlayerState의 NetUpdateFrequency를 늘려야 한다.)

OwnerActor와 AvatarActor가 다른 액터인 경우 둘 다 IAbilitySystemInterface를 구현해야 한다

ASC에서 리플리케이션 모드를 지정해야하는데 

AbilitySystemComponent->InitAbilityActorInfo(this, this); -> ASC초기화  첫번째가 OwnerActor , 두번째가 AvactarActor

보통 플레이어 캐릭터는 PossessedBy  함수에서 서버 초기화하고 , OnRep_PlayerState 에서 client 초기화를 진행한다 

 

GameplayTag

오브젝트의 상태를 분류하고 설명하는데 유용하다  -> bool 이나 열거형으로 다뤘던 상태들을 Tag의 보유 여부로 체크한다 GameplayTag는 DefaultGameplayTags.ini에서 미리 정의해야 한다

ASC는 GameplayTag가 추가되거나 제거될 때 호출되는 델리게이트를 제공

AbilitySystemComponent->RegisterGameplayTagEvent(FGameplayTag::RequestGameplayTag(string).
AddUObject(this, &function;

 

Attribute

Attribute는 FGameplayAttributeData 구조체로 정의된 float값

어트리뷰트값이 변경되면 콜백되는 델리게이트 

AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate
(AttributeSetBase->GetHealthAttribute()).AddUObject(this, &AGDPlayerState::HealthChanged);
virtual void HealthChanged(const FOnAttributeChangeData& Data);

AttributeSet

AttributeSet은 Attribute를 정의 및 관리하고 변경 사항을 처리하는 역할

사용자는 UAttributeSet의 서브 클래스를 구현해서 사용해야 한다

Owner Actor의 생성자에서 AttributeSet을 생성하면 자동으로 해당 ASC에 등록된다

Attribute에서 해당 매크로를 사용하면 getter와 setter init 자동 생성

#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

Attribute 구조

UPROPERTY(BlueprintReadOnly, Category = "Health", ReplicatedUsing = OnRep_Health)
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UGDAttributeSetBase, Health)

 

void UGDAttributeSetBase::OnRep_Health(const FGameplayAttributeData& OldHealth)
{
    GAMEPLAYATTRIBUTE_REPNOTIFY(UGDAttributeSetBase, Health, OldHealth);
}
void UGDAttributeSetBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME_CONDITION_NOTIFY(UGDAttributeSetBase, Health, COND_None, REPNOTIFY_Always);
}

  어트리뷰트를 레플리케이션에 등록하는 방법이다 차례대로 읽고 기억하자 

 PreAttributeChange()

Attribute의 값을 변경하기 전 호출  -> GameplayEvent에 사용하지 말고 주로 클램핑을 위해 사용하라고 안내하고 있습니다

UAbilitySystemComponent::GetGameplayAttributeValueChangeDelegate(FGameplayAttribute Attribute)입니다.-> 이게 event 처리 위치 

PostGameplayEffectExecute() ->Attribute의 Base Value 변경 후 ( PostGameplayEffectExecute()가 호출될 때 Attribute의 변경은 이미 이루어졌지만, 아직 클라이언트로 복제되지 않은 상태)

 

'언리얼 개념 정리' 카테고리의 다른 글

GAS(3)  (0) 2025.09.22
GAS(2)  (0) 2025.09.19
멀티플레이 ( Replication)  (0) 2025.08.24
멀티플레이 (4) RPC  (0) 2025.08.21
멀티플레이 (1) 서버의 종류  (0) 2025.08.21