1. ExecCalc_Damage 계산식 수정
(1) 속성 저항 Attributes 캡쳐
struct AuraDamageStatics
{
// 속성에 대한 Def 생성
DECLARE_ATTRIBUTE_CAPTUREDEF(Armor);
DECLARE_ATTRIBUTE_CAPTUREDEF(ArmorPenetration);
DECLARE_ATTRIBUTE_CAPTUREDEF(BlockChance);
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitChance)
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitDamage)
DECLARE_ATTRIBUTE_CAPTUREDEF(CriticalHitResistance)
DECLARE_ATTRIBUTE_CAPTUREDEF(FireResistance);
DECLARE_ATTRIBUTE_CAPTUREDEF(LightningResistance)
DECLARE_ATTRIBUTE_CAPTUREDEF(ArcaneResistance)
DECLARE_ATTRIBUTE_CAPTUREDEF(PhysicalResistance)
TMap<FGameplayTag, FGameplayEffectAttributeCaptureDefinition> TagsToCaptureDefs;
AuraDamageStatics()
{
// 정적 클래스, 속성, 소스 or 타겟, 스냅샷 여부
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, Armor, Target, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, ArmorPenetration, Source, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, BlockChance, Target, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, CriticalHitChance, Source, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, CriticalHitDamage, Source, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, CriticalHitResistance, Target, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, FireResistance, Target, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, LightningResistance, Target, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, ArcaneResistance, Target, false);
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, PhysicalResistance, Target, false);
const FAuraGameplayTags& Tags = FAuraGameplayTags::Get();
TagsToCaptureDefs.Add(Tags.Attributes_Secondary_Armor, ArmorDef);
TagsToCaptureDefs.Add(Tags.Attributes_Secondary_ArmorPenetration, ArmorPenetrationDef);
TagsToCaptureDefs.Add(Tags.Attributes_Secondary_BlockChance, BlockChanceDef);
TagsToCaptureDefs.Add(Tags.Attributes_Secondary_CriticalHitChance, CriticalHitChanceDef);
TagsToCaptureDefs.Add(Tags.Attributes_Secondary_CriticalHitDamage, CriticalHitDamageDef);
TagsToCaptureDefs.Add(Tags.Attributes_Secondary_CriticalHitResistance, CriticalHitResistanceDef);
TagsToCaptureDefs.Add(Tags.Attributes_Resistance_Fire, FireResistanceDef);
TagsToCaptureDefs.Add(Tags.Attributes_Resistance_Lightning, LightningResistanceDef);
TagsToCaptureDefs.Add(Tags.Attributes_Resistance_Arcane, ArcaneResistanceDef);
TagsToCaptureDefs.Add(Tags.Attributes_Resistance_Physical, PhysicalResistanceDef);
}
};
- DECLARE_ATTRIBUTE_CAPTUREDEF 매크로를 이용하여 캡쳐할 속성을 선언한다.
- DEFINE_ATTRIBUTE_CAPTUREDEF 매크로를 이용하여 속성 세트에서 소스/타겟의 속성을 찾아 가져온다.
- TagsToCaptureDefs 맵을 생성하여 태그와 그에 해당하는 CaptureDef를 가져올 수 있게 한다.
이는 이전에 게임플레이 태그에서 태그-저항 속성 쌍의 맵을 사용하여 태그를 입력해 저항 값을 가져오게 하기 위해서이다.
(2) 생성자 수정
UExecCalc_Damage::UExecCalc_Damage()
{
RelevantAttributesToCapture.Add(DamageStatics().ArmorDef);
RelevantAttributesToCapture.Add(DamageStatics().ArmorPenetrationDef);
RelevantAttributesToCapture.Add(DamageStatics().BlockChanceDef);
RelevantAttributesToCapture.Add(DamageStatics().CriticalHitChanceDef);
RelevantAttributesToCapture.Add(DamageStatics().CriticalHitDamageDef);
RelevantAttributesToCapture.Add(DamageStatics().CriticalHitResistanceDef);
RelevantAttributesToCapture.Add(DamageStatics().FireResistanceDef);
RelevantAttributesToCapture.Add(DamageStatics().LightningResistanceDef);
RelevantAttributesToCapture.Add(DamageStatics().ArcaneResistanceDef);
RelevantAttributesToCapture.Add(DamageStatics().PhysicalResistanceDef);
}
(3) Execute_Implementation 함수 내의 계산식 수정
// Set by Caller Magnitude 가져오기
float Damage = 0.f;
for (auto& Pair : FAuraGameplayTags::Get().DamageTypesToResistances)
{
const FGameplayTag DamageTypeTag = Pair.Key;
const FGameplayTag ResistanceTag = Pair.Value;
checkf(AuraDamageStatics().TagsToCaptureDefs.Contains(ResistanceTag), TEXT("ExecCalc_Damage TagsToCaptureDefs [%s] Tag Missing"), *ResistanceTag.ToString());
const FGameplayEffectAttributeCaptureDefinition CaptureDef = AuraDamageStatics().TagsToCaptureDefs[ResistanceTag];
float DamageTypeValue = Spec.GetSetByCallerMagnitude(DamageTypeTag);
float Resistance = 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(CaptureDef, EvalParams, Resistance);
Resistance = FMath::Clamp(Resistance, 0.f, 100);
// 저항이 데미지를 퍼센트로 깎음
DamageTypeValue *= (100.f - Resistance) / 100.f;
Damage += DamageTypeValue;
}
- 게임플레이 태그의 맵을 가져와 데미지 타입과 속성 저항을 가져온다.
- 데미지 타입에 대한 데미지 값은 DamageTypeValue로 저장한다.
- 속성 저항에 대한 값은 Resistance로 저장한다.
위의 계산식으로 인해 속성 데미지(DamageTypeValue)가 속성 저항만큼의 비율이 곱해지게 된다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
13-1. AI - (1) 몬스터 AI 설정 계획 (0) | 2024.12.27 |
---|---|
12-10. 멀티플레이어 디버깅 (0) | 2024.12.27 |
12-8. 데미지 타입 - (2) 속성 저항 도입 (0) | 2024.12.26 |
12-7. 데미지 타입 - (1) 게임플레이 태그와 게임플레이 어빌리티 생성 (0) | 2024.12.26 |
12-6. UI - (10) 블록, 크리티컬 메세지 띄우기 (0) | 2024.12.26 |