迪哥哪个网站上做游戏直播,苏州企业做网站,网站如何转移到新的空间服务器上,唐山专业做网站公司前面#xff0c;我们实现了近战攻击技能#xff0c;敌人通过AI靠近玩家#xff0c;并且通过AI还能够触发近战攻击的释放。现在我们思考一个问题#xff0c;如果敌人没有武器#xff0c;攻击的手段是用的双手#xff0c;我们该如何去获取它的攻击范围。 现在实现的一套是获…前面我们实现了近战攻击技能敌人通过AI靠近玩家并且通过AI还能够触发近战攻击的释放。现在我们思考一个问题如果敌人没有武器攻击的手段是用的双手我们该如何去获取它的攻击范围。 现在实现的一套是获取武器的攻击范围我们还没有实现在没有武器的情况下还需要区分左右手这样该如何去实现。 我们准备增加对应的标签然后新增一个结构体用于动画和蒙太奇的映射最好能把需要获取的骨骼位置也写入到其中这样如果角色有多个近战攻击动画我们可以随机一个使用然后从内部获取所需的数据进行后续范围判断。 逻辑是这样的开干。
兼容更多的攻击方式
现在我们只支持使用武器攻击我们需要再增加比如左右手的攻击后续甚至有可能增加嘴的攻击比如龙喷火。 首先我们在标签文件RPGGameplayTags.h中增加一些标签使用标签去区分不同的攻击方式。
FGameplayTag Montage_Attack_Weapon; //使用武器攻击蒙太奇标签FGameplayTag Montage_Attack_RightHand; //右手攻击蒙太奇标签FGameplayTag Montage_Attack_LeftHand; //左手攻击蒙太奇标签接着在cpp文件中将标签注册到标签管理器中 /** Montage*/GameplayTags.Montage_Attack_Weapon UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Montage.Attack.Weapon),FString(使用武器攻击蒙太奇标签));GameplayTags.Montage_Attack_LeftHand UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Montage.Attack.LeftHand),FString(左手攻击蒙太奇标签));GameplayTags.Montage_Attack_RightHand UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Montage.Attack.RightHand),FString(右手攻击蒙太奇标签));然后编译打开标签管理器查看标签有没有被正确注册 有了标签我们需要一个可以设置和标签对应蒙太奇动画的结构体这样敌人的普通攻击可以设置多个在技能里面可以兼容多种攻击方式我们没必须为每一种攻击方式创建一个攻击技能。 在CombatInterface.h文件中我们新增一个结构体用于存储对应的蒙太奇标签和骨骼插槽。蒙太奇是攻击使用的动画标签是在动画播放时触发的标签这样可以在接收到标签的事件通知时触发攻击范围检测而骨骼插槽的设置是为了设置攻击的范围的位置
//蒙太奇动画和标签以及骨骼位置的映射用于攻击技能获取和设置攻击范围
USTRUCT(BlueprintType)
struct FTaggedMontage
{GENERATED_BODY()//使用的蒙太奇UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)UAnimMontage* Montage nullptr;//对应的标签UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)FGameplayTag MontageTag;//攻击时的触发伤害的骨骼插槽UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)FName CombatTipSocketName; //设置技能释放的位置
};有了结构体以后我们需要设置它在RPGCharacter.h中我们在角色基类身上设置结构体数组这样我们可以设置多个基础攻击动画。 UPROPERTY(EditAnywhere, CategoryCombat)TArrayFTaggedMontage AttackMontage;有了属性配置我们需要一个函数去获取所以接着在CombatInterface.h文件的战斗接口中添加一个函数用于获取。 UFUNCTION(BlueprintNativeEvent, BlueprintCallable)TArrayFTaggedMontage GetAttackMontages();接着我们在角色基类里面实现它
virtual TArrayFTaggedMontage GetAttackMontages_Implementation() override;实现也很简单直接返回即可
TArrayFTaggedMontage ARPGCharacter::GetAttackMontages_Implementation()
{return AttackMontage;
}我们还需要一个获取骨骼插槽位置的函数这个函数可以通过结构体去判断获取武器上的插槽还是角色模型身上的武器插槽。 所以我们在RPGCharacter.h中接着创建一个虚函数用于通过数据获取位置 UFUNCTION(BlueprintNativeEvent, BlueprintCallable)FVector GetCombatSocketLocationByStruct(const FTaggedMontage TaggedMontage) const;在角色基类中覆写
virtual FVector GetCombatSocketLocationByStruct_Implementation(const FTaggedMontage TaggedMontage) const override;在实现这里我们通过结构体判断当前是否使用武器攻击如果使用武器攻击则从武器上面获取插槽位置反之则从角色模型身上获取插槽位置。
FVector ARPGCharacter::GetCombatSocketLocationByStruct_Implementation(const FTaggedMontage TaggedMontage) const
{if(TaggedMontage.MontageTag.MatchesTagExact(FRPGGameplayTags::Get().Montage_Attack_Weapon)){return Weapon-GetSocketLocation(TaggedMontage.CombatTipSocketName);}else{return GetMesh()-GetSocketLocation(TaggedMontage.CombatTipSocketName);}
}修改蓝图适配新的逻辑
上面我们修改相关逻辑编译后打开UE我们也需要将蓝图修改以后适配新的逻辑。 首先打开普通攻击技能蓝图在设置完朝向后从创建的数组中获取一条结构体使用为了方便后面使用我们将其保存为变量如果直接链接到后面随机的逻辑将会重新随机所以我们保存为变量并通过变量结构体获取需要使用的蒙太奇。 接着修改播放完成蒙太奇后的逻辑事件修改为结构体内的标签获取位置方法改为通过结构体获取 如果蒙太奇被打断了技能会无法结束所以我们还需要设置在动画完成或中断时结束技能
打开战士的蓝图配置结构体数据 最重要的一步就是要修改蒙太奇里面的通知这样才可以触发事件 修改完成以后查看效果是否正常。