* 데미지를 얻고, 블록 계산후, 실제속성(데미지)를 변경하고자함
void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
// Get Damage Set by Caller Magnitude
float Damage = Spec.GetSetByCallerMagnitude(FAuraGameplayTags::Get().Damage);
//Capture Blockchacne on target , 블록인지 결정
//블록이면, 데미지 없애기
//실제속성변경
const FGameplayModifierEvaluatedData EvaluatedData(UAuraAttributeSet::GetIncomingDamageAttribute(), EGameplayModOp::Additive, Damage);
OutExecutionOutput.AddOutputModifier(EvaluatedData);
* 블록찬스 속성을 캡쳐 구현
구조체안에 BlockChance 추가
//BP에노출안할거임, c++안에서만 사용되는 원시구조체
struct AuraDamageStatics
{
//캡쳐속성 선언 매크로 : 속성포인터가지고있음
DECLARE_ATTRIBUTE_CAPTUREDEF(Armor);
DECLARE_ATTRIBUTE_CAPTUREDEF(BlockChance);
AuraDamageStatics()
{
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, Armor, Target, false); //아머라는 속성을 캡쳐하겠다. 스냅샷X
DEFINE_ATTRIBUTE_CAPTUREDEF(UAuraAttributeSet, BlockChance, Target, false); //아머라는 속성을 캡쳐하겠다.
}
};
//싱글톤 Getter
static const AuraDamageStatics& DamageStatics()
{
static AuraDamageStatics Dstatics;
return Dstatics;
}
UExecCalc_Damage::UExecCalc_Damage()
{
RelevantAttributesToCapture.Add(DamageStatics().ArmorDef); //캡쳐속성 배열에추가
RelevantAttributesToCapture.Add(DamageStatics().BlockChanceDef); //캡쳐속성 배열에추가
}
void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
...
//Capture Blockchacne on target , 블록인지 결정
//블록이면, 데미지 절반으로
float TargetBlockChance = 0.f;
//현재 설정되있는 BlockChance값을 얻어와서 Out변수에 집어넣음 (현재 4로 설정되있음)
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(DamageStatics().BlockChanceDef, EvaluationParameters,TargetBlockChance );
TargetBlockChance = FMath::Max<float>(TargetBlockChance,0.f);
//블록확률 25%
const bool bBlocked = FMath::RandRange(1,100) < TargetBlockChance;
if(bBlocked) Damage *= .5f;
//실제속성변경
const FGameplayModifierEvaluatedData EvaluatedData(UAuraAttributeSet::GetIncomingDamageAttribute(), EGameplayModOp::Additive, Damage);
OutExecutionOutput.AddOutputModifier(EvaluatedData);
}
'UE5 > Damage' 카테고리의 다른 글
[UE5] 데미지계산 계수 하드코딩 fix (0) | 2024.06.24 |
---|---|
[UE5] 방어력, 방관 구현 (0) | 2024.06.24 |
[UE5] 실행 계산 개념, 아머속성 계산-변경 구현 (0) | 2024.06.23 |
[UE5] 맞은적 머리위에 데미지 뜨도록 구현 (0) | 2024.06.23 |
[UE5] 적 죽을때 용해효과 구현 (0) | 2024.06.23 |