관리 메뉴

Mini

[UE5] Block Chance 구현 본문

UE5/Damage

[UE5] Block Chance 구현

Mini_96 2024. 6. 23. 23:43

* 데미지를 얻고, 블록 계산후, 실제속성(데미지)를 변경하고자함

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);
}

BlockChacne 가 현재 4로 설정되있는 모습
결과 : 확률에 따라 20이뜨는 모습

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/2c4be4a60eb166c479ba075e56c6cbd0d7c1d49e

 

feat : Block Chance 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@2c4be4a

Bisu96 committed Jun 23, 2024

github.com