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);
}
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을 입력하면된다.
'UE5 > GAS' 카테고리의 다른 글
[UE5] GAS EffectActor // 포션먹으면 hp증가 구현, const_cast (0) | 2024.05.26 |
---|---|
[UE5] GAS Ability Actor Info // 능력 정보초기화 하는방법 (0) | 2024.05.26 |
[UE5] GAS 복제 모드 설정 // 멀티플레이설계 -> 싱글플레이 작동가능(역X) (0) | 2024.05.26 |
[UE5] GAS 구현 // ASC, AS Getter구현 (0) | 2024.05.26 |
[UE5] Gas Server 이해 (0) | 2024.05.26 |