当前位置: 首页 > 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

相关文章:

  • RabbitMQ可靠和延迟队列
  • 接收rabbitmq消息
  • 中心化交易所(CEX)架构:高并发撮合引擎与合规安全体系
  • [蓝桥杯 2024 国 Python B] 设计
  • TripGenie:畅游济南旅行规划助手:个人工作纪实(二十四)
  • Arduino入门教程:1、Arduino硬件介绍
  • LAN、WAN、WLAN、VLAN 、VPN对比
  • Java异步编程深度解析:从基础到复杂场景的难题拆解
  • 动态多目标进化算法:VARE(Vector Autoregressive Evolution)求解DF1-DF14,提供完整MATLAB代码
  • [服务器] Amazon Lightsail SSH连接黑屏的常见原因及解决方案
  • 曼昆《经济学原理》第九版 第十七章寡头垄断
  • 【leetcode】36. 有效的数独
  • 【Axure高保真原型】中继器表格更多操作
  • API:解锁数字化协作的钥匙及开放实现路径深度剖析
  • 产品升级 | 新一代高性能数据采集平台BRICK2 X11,助力ADAS与自动驾驶开发
  • 【AI】模型vs算法(以自动驾驶为例)
  • RPA与Agent技术如何结合,以实现跨系统、跨平台的工作流程自动化?
  • 本地docker部署的dify,不用git命令如何无损升级?
  • Redis分布式缓存(RDB、AOF、主从同步)
  • ArcGIS中坐标系一致但图层无法重叠问题解决
  • 东莞四网合一网站建设/seo运营
  • web网站开发培训/百度seo优化关键词
  • 辽阳企业网站建设价格/网络推广优化招聘
  • 武汉做网站seo优化/软文推广怎么做
  • wordpress可以做电影站/谷歌搜索引擎怎么才能用
  • axcure做网站ui/软文范例200字