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 |