当前位置: 首页 > news >正文

RPG24.设置武器伤害(二):将效果应用于目标

1.打开XMBGameplayTags,添加新的标签用于在造成伤害时进行激活计算

ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Shared_SetByCaller_BaseDamage);
ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Player_SetByCaller_AttackType_Light);ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Player_SetByCaller_AttackType_Heavy);
UE_DEFINE_GAMEPLAY_TAG(Shared_SetByCaller_BaseDamage, "Shared.SetByCaller.BaseDamage");UE_DEFINE_GAMEPLAY_TAG(Player_SetByCaller_AttackType_Light, "Player.SetByCaller.AttackType.Light");UE_DEFINE_GAMEPLAY_TAG(Player_SetByCaller_AttackType_Heavy, "Player.SetByCaller.AttackType.Heavy");

2.进入XMBGameplayAbilityBase,创建新函数,用于制作角色的伤害句柄

//返回一个伤害效果UFUNCTION(BlueprintPure, Category = "XMB|Ability")FGameplayEffectSpecHandle MakeXMBDamageEffectSpecHandle(TSubclassOf<UGameplayEffect> EffectClass,float InWeaponBaseDamage,FGameplayTag InCurrentAttackTypeTag, int32 InCurrentCombatCount);

FGameplayEffectSpecHandle UXMBGameplayAbilityBase::MakeXMBDamageEffectSpecHandle(TSubclassOf<UGameplayEffect> EffectClass, float InWeaponBaseDamage, FGameplayTag InCurrentAttackTypeTag,int32 InCurrentCombatCount)
{//检查EffectClasscheck(EffectClass);//创建HandleFGameplayEffectContextHandle ContextHandle = GetXMBAbilitySystemComponentFromActorInfo()->MakeEffectContext();ContextHandle.SetAbility(this);//设置Ability实例ContextHandle.AddSourceObject(GetAvatarActorFromActorInfo());//设置源对象ContextHandle.AddInstigator(GetAvatarActorFromActorInfo(),GetAvatarActorFromActorInfo());//在这一步指定ability的使用者和abiility的拥有者FGameplayEffectSpecHandle EffectSpecHandle = GetXMBAbilitySystemComponentFromActorInfo()->MakeOutgoingSpec(EffectClass,GetAbilityLevel(),ContextHandle);//设置伤害EffectSpecHandle.Data->SetSetByCallerMagnitude(XMBGameplayTags::Shared_SetByCaller_BaseDamage,InWeaponBaseDamage);//设置当前攻击类型if (InCurrentAttackTypeTag.IsValid()){EffectSpecHandle.Data->SetSetByCallerMagnitude(InCurrentAttackTypeTag, InCurrentCombatCount);	}return EffectSpecHandle;
}

3.新建一个计算类

4.打开XMBStructTypes.h,向FXMBWeaponBase内添加用于记录武器基础伤害的数据表格

USTRUCT(BlueprintType)
struct FXMBWeaponData
{GENERATED_BODY()UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)TSubclassOf<UPlayerLinkedAnimLayer> WeaponAnimLayerToLink;UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)UInputMappingContext* WeaponInputMappingContext;UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InpuTTag"))TArray<FXMBAbilitySet> DefaultWeaponAbilities;//数据表格UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)FScalableFloat WeaponBaseDamage;
};

5.打开PawnCombatComponent.h,向内添加两个函数

//获取当前装备的武器UFUNCTION(BlueprintCallable, Category = "Warripr|Combat")APlayerWeapon* GetPlayerCurrentEquippedWeapon() const;//获取当前武器的伤害UFUNCTION(BlueprintCallable, Category = "Warripr|Combat")float GetPlayerCurrentEquipWeaponDamageAtLevel(float InLevel) const;
APlayerWeapon* UPlayerCombatComponent::GetPlayerCurrentEquippedWeapon() const
{return Cast<APlayerWeapon>(GetCharacterCurrentEquippedWeapon());
}float UPlayerCombatComponent::GetPlayerCurrentEquipWeaponDamageAtLevel(float InLevel) const
{return GetPlayerCurrentEquippedWeapon()->PlayerWeaponData.WeaponBaseDamage.GetValueAtLevel(InLevel);
}

6。启动项目,创建一个曲线表格用于记录武器伤害

打开武器,搜索basedamage,选择表格

7.启动项目,创建共享ge

然后选择计算伤害

8.打开LightAttackmaster

9。现在要将效果应用于目标

打开XMBGameplayAbility.h

FActiveGameplayEffectHandle NativeApplyEffectSpecHandleToTarget(AActor* TargetActor, const FGameplayEffectSpecHandle& InSpecHandle);
FActiveGameplayEffectHandle UXMBGameplayAbility::NativeApplyEffectSpecHandleToTarget(AActor* TargetActor,const FGameplayEffectSpecHandle& InSpecHandle)
{UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);return XMBGetAbilitySystemComponentFromActorInfo()->ApplyGameplayEffectSpecToTarget(*InSpecHandle.Data,TargetASC);
}

再创建一个函数用在蓝图里使用,为了确保是否将效果应用给目标,创建一个函数进行验证,和一个枚举用于返回是否应用于目标的结果

先创建枚举

UENUM()
enum class EWarriorSuccessType : uint8
{Successful,Failed
};

然后创建函数

	UFUNCTION(BlueprintCallable, Category = "Warrior|Ability",meta = (displayname = "Apply Gameplay Effect Spec Handle To Target Actor",ExpandEnumAsExecs = "OutSuccessType"))FActiveGameplayEffectHandle BP_ApplyEffectSpecHandleToTarget(AActor* TargetActor, const FGameplayEffectSpecHandle& InSpecHandle,EWarriorSuccessType& OutSuccessType);
FActiveGameplayEffectHandle UXMBGameplayAbility::BP_ApplyEffectSpecHandleToTarget(AActor* TargetActor,const FGameplayEffectSpecHandle& InSpecHandle, EWarriorSuccessType& OutSuccessType)
{FActiveGameplayEffectHandle ActiveGameplayEffectHandle = NativeApplyEffectSpecHandleToTarget(TargetActor,InSpecHandle);OutSuccessType = ActiveGameplayEffectHandle.WasSuccessfullyApplied() ? EWarriorSuccessType::Successful : EWarriorSuccessType::Failed;return ActiveGameplayEffectHandle;
}

10.启动项目,打开LightAttackMaster

http://www.xdnf.cn/news/974845.html

相关文章:

  • defaultdict 在python中的作用
  • 传输层协议 TCP 介绍 -- TCP协议格式,确认应答机制,超时重传机制,连接管理机制,滑动窗口,流量控制,拥塞控制,延迟应答,捎带应答
  • 告别尺寸混乱!CAD 快速看图【比例】功能精准校准,测量标注零误差
  • 批量转灰度图和调整图片大小
  • 如何在 TypeScript 中使用类型保护
  • Vim鼠标右键复制问题解决方法
  • java转PHP开发需要几步?
  • PHP基础-语法变量
  • LVS 负载均衡详解:四层转发原理与三种经典模式全面解析
  • 谈文件系统
  • Vue 中的数据代理机制
  • 中兴B860AV1.1_MSO9280_降级后开ADB-免刷机破解教程(非刷机)
  • Java面试题019:一文深入了解微服务之负载均衡Ribbon
  • Wireshark 筛选功能详解:语法与示例
  • 一些学习网站分享
  • OctoPrint公网部署如何实现?3D打印远程控制一键部署过程!
  • 《零基础读懂新能源汽车》——V2G/电池梯次利用/氢能源生态级技术拆解与商业预言
  • 智能体商业化:创建-接入-封装成小程序/网站/H5
  • PHP7+MySQL5.6 雪里开简易预约制访客管理系统V1.0
  • 深度解读云防火墙(WAF):守护网络安全的智能卫士
  • 在当系统未连接上wifi的时候,直接不显示wifi列表 ,这个判断导致?
  • UI 设计|审美积累|新拟态风格(Neumorphism)
  • 【华为Pura80系列】鸿蒙生态再升级:Pura 80 系列影像突破,WATCH 5 开启智能手表新纪元
  • 2025 年 MQTT 技术趋势:驱动 AI 与物联网未来发展的关键动力
  • 理解什么是并查集
  • 阿糖胞苷联合伊达比星为代表的强化治疗方案引领AML多阶段治疗新进展
  • 学习threejs,使用TSL计算粒子鼠标特效
  • Maven 构建性能优化深度剖析:原理、策略与实践
  • 目标检测yolo算法
  • AI赋能Automa二次开发