관리 메뉴

Mini

[UE5] GAS 속성개념, 구현, 속성추가방법, 디버깅방법 본문

UE5/GAS

[UE5] GAS 속성개념, 구현, 속성추가방법, 디버깅방법

Mini_96 2024. 5. 26. 20:22

1. ASC는 (AttirubteSet) 같은클래스 타입을 여러개가질수 없음. //모호하기 때문

2. 한 AS내에 모든속성 때려박기는 가능

 

3. 속성이란?

숫자임, float임

속성은 FGameplayAttributeData 구조체 내에 존재함.

속성은 AttributeSet에 저장됨. AS는 속성들을 관리함.

GameplayEffet => 속성값 변경

* 예측(Prediction) : 값은 클라에서 변경하고, 서버에 알리기만함. 서버가 invalid하다고 판단하면 롤백할수 있음.

 

4.예측(Prediction) 

* 예측이 없는경우

클라가서버에 피를-1깍겠다고 요청을보냄 -> 검증 -> ok신호 -> 피가1깍임

(-) 100밀리초정도 걸림 => bad play 경험...(렉)

 

*예측을 사용하는 경우

gameplayEffect에서 즉시 피를 1깍음 -> 서버에 알림 -> valid -> 서버에서 다른클라에알림

gameplayEffect에서 즉시 피를 1깍음 -> 서버에 알림 -> Notvalid(핵 등) -> 서버에서 롤백시킴

 

5. Base 값 vs 현재값

현재값 = base + 임시값(버프)

버프가 끝난후 base로 돌아갸아하므로

둘다 저장해야함!

 

6. 체력바를위해 

MaxHp, 현재Hp로 구성하는것이 옳다.

 

7. 구현

1. 속성의 타입은 FGameplayAttributeData 이다.

2. 변경시 실행할 함수를 설정해준다. 

관례는 OnRep_속성명 이다.

// 체력 속성, 네트워크 복제됨, 변경 시 OnRep_Health 함수 호출
	UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Vital Attributes")
	FGameplayAttributeData Health;

 

// 체력이 변경될 때 호출되는 함수
	UFUNCTION()
	void OnRep_Health(const FGameplayAttributeData& OldHealth) const;

 

// 'Health' 속성이 변경될 때 호출되는 함수
void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const
{
	// 'Health' 속성의 변경을 처리
	GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Health, OldHealth);
}

여기서 OldHealth값은 핵등으로 서버가 롤백할때, 필요한값이기 때문이다.

 

3.네트워크에 복제할 속성들을 등록

속성들을 등록해줘야한다. 안해주면 빌드에러가 난다.

NOTIFY(속성들이있는 클래스, 속성, 항상복제, 항상알림) 의 형식이다. 

// 네트워크 복제를 위한 속성 설정을 정의하는 함수
void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	// 부모 클래스의 같은 함수를 호출하여 기본 설정을 상속받음
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	// 'Health'와 'MaxHealth' 속성을 네트워크 복제하도록 설정
	// 값이 변경될 때마다 알림이 발생하도록 설정
	//UAuraAttributeSet: 이는 매크로가 적용될 클래스입니다. 이 경우 UAuraAttributeSet 클래스 내의 멤버 변수를 복제할 것임을 의미합니다.
	//MaxMana: 이는 네트워크를 통해 복제할 멤버 변수의 이름입니다. MaxMana라는 이름의 멤버 변수가 변경될 때, 그 변경 사항이 네트워크를 통해 다른 클라이언트에게 전달됩니다.
	//COND_None: 이는 복제 조건을 나타냅니다. COND_None은 별다른 조건 없이 항상 복제하겠다는 것을 의미합니다.
	//REPNOTIFY_Always: 이는 복제 알림 방식을 나타냅니다. REPNOTIFY_Always는 변수가 변경될 때마다 항상 알림이 발생하도록 설정합니다. 즉, MaxMana 변수의 값이 변경될 때마다, 그 변경 사항에 대한 알림이 발생하고 관련된 함수가 호출됩니다.
	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Health, COND_None, REPNOTIFY_Always);
	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxHealth, COND_None, REPNOTIFY_Always);
	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Mana, COND_None, REPNOTIFY_Always);
	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxMana, COND_None, REPNOTIFY_Always);
}

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/66b6efac9739d6dbb21cba288155d198c44ea27f

 

feat : 체력,마나 복제 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@66b6efa

클라에서 변경 -> 서버에서 유효한지검사

github.com

 

4. Getter, Setter 매크로 등록

#include "AbilitySystemComponent.h"
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
// 체력 속성, 네트워크 복제됨, 변경 시 OnRep_Health 함수 호출
	UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Vital Attributes")
	FGameplayAttributeData Health;
	ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Health);
	//Getter,Setter 자동생성해주는 매크로(적용될클래스, 속성이름)

*setter 사용 //생성자에서 사용함

UAuraAttributeSet::UAuraAttributeSet()
{
	//Setter 사용
	InitHealth(100.f);
	InitMaxHealth(100.f);
	InitMana(50.f);
	InitMaxMana(50.f);
}

8. 디버깅방법

~물결표 누른후

showdebug abilitysystem을 입력하면된다.