1. mmc 클래스생성
2.
*/
UCLASS()
class AURA_API UMMC_MaxHealth : public UGameplayModMagnitudeCalculation
{
GENERATED_BODY()
public:
UMMC_MaxHealth();
virtual float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override;
private:
FGameplayEffectAttributeCaptureDefinition VigorDef;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "AbilitySystem/ModMagCalc/MMC_MaxHealth.h"
#include "AbilitySystem/AuraAttributeSet.h"
#include "Interaction/CombatInterface.h"
UMMC_MaxHealth::UMMC_MaxHealth()
{
//VigorDef 채우기
VigorDef.AttributeToCapture = UAuraAttributeSet::GetVigorAttribute(); //AS클래스에서 getter매크로 사용
VigorDef.AttributeSource=EGameplayEffectAttributeCaptureSource::Target; //타겟vs소스
VigorDef.bSnapshot = false; //타이밍
RelevantAttributesToCapture.Add(VigorDef);
}
float UMMC_MaxHealth::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const
{
//gather tags from source and target
const FGameplayTagContainer* SourceTags = Spec.CapturedSourceTags.GetAggregatedTags();
const FGameplayTagContainer* TargetTags = Spec.CapturedTargetTags.GetAggregatedTags();
FAggregatorEvaluateParameters EvaluateParameters;
EvaluateParameters.TargetTags = TargetTags;
EvaluateParameters.SourceTags = SourceTags;
//* vigor과 level을 얻은후, 계산해서 리턴하면됨
float Vigor=0.f;
GetCapturedAttributeMagnitude(VigorDef,Spec,EvaluateParameters,Vigor); //Vigor에 Vigor값 넣어줘
Vigor=FMath::Max<float>(Vigor,0.f);
ICombatInterface* CombatInterface = Cast<ICombatInterface>(Spec.GetContext().GetSourceObject());
const int32 PlayerLevel = CombatInterface->GetPlayerLevel();
return 80.f+2.5f*Vigor+10.f*PlayerLevel;
}
3. GE에서 커스텀으로 수정
*문제 : IcombatInterface가 널임
* 해결 : 객체생성
캐릭베이스 > ApplyEffectToself함수에서 소스객체 설정하는 부분이 있었음
※
FGameplayEffectContextHandle ContextHandle = GetAbilitySystemComponent()->MakeEffectContext();
ContextHandle.AddSourceObject(this); //캐릭이면 캐릭자체, 적이면 적이 소스임
4. 결과
5. 최대마나설정 실습
* 의문 : 최대체력, 마나는 int, vigor, 레벨에 의존성임
아래처럼 하드코딩 안하고 제대로 설정하는 방법? -> 다음시간에
UAuraAttributeSet::UAuraAttributeSet()
{
//Setter 사용
InitHealth(10.f);
//InitMaxHealth(100.f);
InitMana(10.f);
//InitMaxMana(100.f);
}
6. 의문해결 실습
i) 캐릭베이스에 추가
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Attributes")
TSubclassOf<UGameplayEffect> DefaultVitalAttributes;
when? : 보조속성 set 후
void AAuraCharacterBase::InitializeDefaultAttributes() const
{
ApplyEffectToSelf(DefaultPrimaryAttributes, 1.f);
ApplyEffectToSelf(DefaultSecondaryAttributes, 1.f);
ApplyEffectToSelf(DefaultVitalAttributes, 1.f);
}
ii) GE_Vital 만들고,
Health = maxHp로 설정
마나도 동일
iii) BP_Aura에서
VitalAttribute의존성을 내가만든 GE로 주입
'UE5 > RPG Attributes' 카테고리의 다른 글
[UE5] RPG 속성 퀴즈 (0) | 2024.06.07 |
---|---|
[UE5] 커스텀 속성계산1, 레벨 구현 (0) | 2024.06.07 |
[UE5] 보조속성구현, 주요속성변경시 자동변경 (0) | 2024.06.07 |
[UE5] 속성 정의, 보조속성 추가하기 (0) | 2024.06.07 |
[UE5] 수정자 Coefficient, pre ,post 이해 (0) | 2024.06.07 |