1. 태그추가
struct FAuraGameplayTags
{
FGameplayTag Damage_Fire;
GameplayTags.Damage_Fire = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Damage.Fire"),
FString("Fire Damage Type")
);
2. DamageAbility 추가
상속관계 : Spell -> DamageAbility -> AuraAbility
UCLASS()
class AURA_API UAuraProjectileSpell : public UAuraDamageGameplayAbility
변수 이사
UCLASS()
class AURA_API UAuraDamageGameplayAbility : public UAuraGameplayAbility
{
GENERATED_BODY()
protected:
UPROPERTY(EditDefaultsOnly,BlueprintReadOnly) //데미지줄 GE //moved from spell
TSubclassOf<UGameplayEffect> DamageEffectClass;
UPROPERTY(EditDefaultsOnly,BlueprintReadOnly, Category="Damage") //moved from parent
FScalableFloat Damage;
};
맵 변수 추가
UPROPERTY(EditDefaultsOnly, Category="Damaage")
TMap<FGameplayTag, FScalableFloat> DamageTypes; //<태그, 데미지 > 매핑용
3. Spell 에서
Map 완탐하면서 데미지계산
void UAuraProjectileSpell::SpawnProjectile(const FVector& ProjectileTargetLocation)
{
...
for(auto& Pair : DamageTypes)
{
//레벨별 데미지 얻기
const float ScaledDamage = Pair.Value.GetValueAtLevel(GetAbilityLevel());
UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(SpecHandle, Pair.Key, ScaledDamage);
}
4. 모든 피해에 대해서 총 데미지 계산 구현
우리는 exec에서 태그로 데미지를 얻어오고있음
이제는 모든 데미지 유형에 대해 데미지를 얻어와야함 -> 태그에서 배열로 관리하면 좋을듯
void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
...
// Get Damage Set by Caller Magnitude
float Damage = Spec.GetSetByCallerMagnitude(FAuraGameplayTags::Get().Damage);
struct FAuraGameplayTags
{
public:
...
TArray<FGameplayTag> DamageTypes;
GameplayTags.DamageTypes.Add(GameplayTags.Damage_Fire);
refactor 후 : 모든 피해에 대해서 총 데미지를 계산가능.
void UExecCalc_Damage::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams,
FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
...
// Get Damage Set by Caller Magnitude
float Damage = 0.f;
for(FGameplayTag DamageTypeTag : FAuraGameplayTags::Get().DamageTypes)
{
const float DamageTypeValue = Spec.GetSetByCallerMagnitude(DamageTypeTag);
Damage += DamageTypeValue;
}
* 결과확인 :
Map에 여러 효과들을 넣을수있음.
Firebolt 이외에도
* 문제 : 크리데미지가 너무 높음
* next : 방어력, 마법저항력 구현
'UE5 > Advance Damage Techniques' 카테고리의 다른 글
[UE5] 방마저에따른 데미지 감소 구현 (0) | 2024.08.22 |
---|---|
[UE5] 방마저 속성추가 / 리플리케이션 / 속성위젯에 속성추가 (0) | 2024.08.18 |
[UE5] 크리시 글자 애니메이션 구현, 메시지 구현, 인스턴싱 정책 (0) | 2024.08.14 |
[UE5] 크리티컬시, 노란글씨로 구현 (0) | 2024.08.14 |
[UE5] Custum GE Context // Net Serialize, Custom Effect Context (0) | 2024.08.14 |