61. UE5 RPG 实现敌人近战攻击技能和转向攻击

在前面,我们实现了敌人的AI系统,敌人可以根据自身的职业进行匹配对应的攻击方式。比如近战战士会靠近目标后进行攻击然后躲避目标的攻击接着进行攻击。我们实现了敌人的AI行为,但是现在还没有实现需要释放的技能,接下来,我们将实现敌人的使用的技能,刚好回顾一下之前的实现的功能。

首先基于之前的伤害技能基类,创建一个近战技能基类
在这里插入图片描述
命名为近战技能 RPGMeleeAbility
在这里插入图片描述
我们要实现技能的激活,需要使用到GameplayTag,所以我们增加一个新的技能标签用于激活。
在RPGGameplayTags.h增加新的标签

FGameplayTag Abilities_Attack; //攻击技能激活标签

然后将标签添加到标签管理器

	/*
	 * Abilities
	 */
	
	GameplayTags.Abilities_Attack = UGameplayTagsManager::Get()
		.AddNativeGameplayTag(
			FName("Abilities.Attack"),
			FString("攻击技能标签")
		);

接下来,我们要实现在角色数据表里面配置它的技能,打开Character Class Info.h增加对应的属性设置

//对应每个职业的属性和技能
USTRUCT()
struct FCharacterClassDefaultInfo
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly, Category="Class Defaults")
	TSubclassOf<UGameplayEffect> PrimaryAttributes;

	UPROPERTY(EditDefaultsOnly, Category="Class Defaults")
	TArray<TSubclassOf<UGameplayAbility>> StartupAbilities;
};

后面在UE的蓝图里面设置以后,我们可以在结构体内获取需要应用的技能。接下来,我们还需要回忆一下如何应用敌人的技能的,我们是在敌人的基类里面,去实现的技能的应用,
在这里插入图片描述
我们要扩展这个函数,增加传入角色的类型,通过类型去获取特定职业的技能。

	//初始化角色的技能
	UFUNCTION(BlueprintCallable, Category="MyAbilitySystemLibrary|CharacterClassDefaults")
	static void GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC, ECharacterClass CharacterClass);

扩展函数,从数据结构中获取到数据并应用到角色的ASC上

void URPGAbilitySystemBlueprintLibrary::GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC, ECharacterClass CharacterClass)
{
	//从实例获取到关卡角色的配置
	UCharacterClassInfo* CharacterClassInfo = GetCharacterClassInfo(WorldContextObject);
	if(CharacterClassInfo == nullptr) return;

	//从战斗接口获取到角色的等级
	ICombatInterface* CombatInterface = Cast<ICombatInterface>(ASC->GetAvatarActor());
	int32 CharacterLevel = 1;
	if(CombatInterface)
	{
		CharacterLevel = CombatInterface->GetPlayerLevel();
	}

	//应用角色拥有的技能数组
	for(const TSubclassOf<UGameplayAbility> AbilityClass : CharacterClassInfo->CommonAbilities)
	{
		FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, CharacterLevel); //创建技能实例
		ASC->GiveAbility(AbilitySpec); //只应用不激活
	}

	//获取到默认的基础角色数据
	const FCharacterClassDefaultInfo ClassDefaultInfo = CharacterClassInfo->GetClassDefaultInfo(CharacterClass);

	//应用职业技能数组
	for(const TSubclassOf<UGameplayAbility> AbilityClass : ClassDefaultInfo.StartupAbilities)
	{
		FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, CharacterLevel); //创建技能实例
		ASC->GiveAbility(AbilitySpec); //只应用不激活
	}
}

敌人的角色类型也是设置在敌人基类上的,所以我们可以直接调用时传入

	//初始化角色的技能
	if(HasAuthority()){
		URPGAbilitySystemBlueprintLibrary::GiveStartupAbilities(this, AbilitySystemComponent, CharacterClass);
	}

在UE中设置

接着我们可以编译代码打开UE,在UE里面创建一个对应的蓝图类
在这里插入图片描述
命名为GA_GoblinSpearAttack
在这里插入图片描述
首先设置技能标签,我们就可以通过标签激活技能。
在这里插入图片描述
在技能里实现测试代码,在触发技能时,绘制一个绿色的球
在这里插入图片描述
接着打开我们的数据表,现在每个职业多了一个需要设置的技能数组,将我们创建的技能添加给战士
在这里插入图片描述
攻击是由AI触发的,所以,我们在AI的攻击任务中,通过标签激活技能即可。我们从控制的pawn中获取到ASC,然后通过标签激活技能
在这里插入图片描述
创建的变量我们可以将其设置外部可以设置
在这里插入图片描述
然后再行为树中设置激活的技能标签
在这里插入图片描述
接着运行测试效果,如果允许哥布林在攻击时绘制绿色的球,证明我们技能激活成功。
在这里插入图片描述

设置技能攻击蒙太奇

回忆一下之前我们实现的火球术,需要使用一个蒙太奇动画,然后在蒙太奇动画中触发事件发射火球实现技能的释放。接下来,我们使用同样的思路实现近战攻击的技能。
找到敌人的攻击动画,创建一个蒙太奇
在这里插入图片描述
创建名称AM_Attack_GoblinSpear,方便在蒙太奇下拉中选择
在这里插入图片描述
在蒙太奇中,我们需要增加MotionWarping来控制朝向,注意,动画必须要支持根动画
在这里插入图片描述
设置角色在蓄力的时候转向
在这里插入图片描述
设置触发名称,关闭移动,只留下转向,切换转向类型为朝向目标
在这里插入图片描述
我们有了蒙太奇,还需要实现在攻击时朝向攻击目标,按照之前的实现方式,我们通过MotionWarpping插件实现转向。

添加转向插件

我们需要在敌人基类身上增加MotionWarpping插件
在这里插入图片描述
实现调用,和主角的一样即可,其实这里我们可以实现一个角色基类蓝图,在里面设置一些通用的函数,这里先不改。
在这里插入图片描述
要实现这个功能,我们需要让敌人知道攻击目标的位置,然后攻击时朝向它,我们需要在AI控制器中获取到目标。
我们在敌人接口里增加两个函数,用于设置和获取攻击目标,这里设置了BlueprintNativeEvent,它默认给我们实现,并且可以在蓝图中实现此函数,如果在蓝图中实现了此函数,在蓝图中调用,将使用蓝图的版本。

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void SetCombatTarget(AActor* InCombatTarget); //设置敌人的攻击目标

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	AActor* GetCombatTarget() const; //获取敌人的攻击目标

接下来我们在敌人基类里面覆写这两个函数,并去实现,这样写法是因为我们是通过UE让蓝图去实现的此函数,所以我们需要加上Vitrual和后面的_Implementation

	/* IEnemyInterface敌人接口 */
	virtual void HighlightActor() override; //高亮
	virtual void UnHighlightActor() override; //取消高亮
	virtual AActor* GetCombatTarget_Implementation() const override;
	virtual void SetCombatTarget_Implementation(AActor* InCombatTarget) override;
	/* IEnemyInterface敌人接口 结束 */

在cpp中实现这两个函数,我们也可以在蓝图中实现,这里看个人喜好

AActor* ARPGEnemy::GetCombatTarget_Implementation() const
{
	return CombatTarget;
}

void ARPGEnemy::SetCombatTarget_Implementation(AActor* InCombatTarget)
{
	CombatTarget = InCombatTarget;
}

有了设置攻击目标的函数,我们在AI攻击任务里面就可以设置攻击对象了。
在任务里增加一个黑板键选择器,用于在AI行为树中设置绑定的黑板键
在这里插入图片描述
在AI行为树中设置攻击目标为跟随目标黑板键
在这里插入图片描述
这样我们就可以在任务里面获取攻击目标,并设置给控制的Pawn身上
在这里插入图片描述
接下来,我们在技能里面,从角色身上获取到攻击目标,然后转换为战斗接口,调用偏转朝向的函数,将朝向位置设置,然后再调用蒙太奇播放动画
在这里插入图片描述
接着允许查看效果,是否真的能捅向目标
在这里插入图片描述

添加攻击事件

接下来,我们需要在蒙太奇动画里,攻击的那一刻,触发一个事件,来告诉技能当前可以计算攻击。就像之前实现火球术时的一样。
在这里插入图片描述
由于我们没有设置对应的通知,我们去标签管理器增加一个近战攻击的通知标签。由于这个标签不需要在c++内使用,所以我们可以直接通过UE添加。
在这里插入图片描述
设置属于攻击的近战攻击标签
在这里插入图片描述
设置完成,打开蒙太奇,设置到通知上面,这样就可以在技能里面去接收对应的标签通知了。
在这里插入图片描述
然后我们在技能中设置等待游戏事件即可,Only Match Exact是标签必须全部匹配才可以触发事件
在这里插入图片描述
现在我们接收到事件了,还需要考虑如何触发攻击。在之前实现火球从法杖杖尖处释放时,我们在战斗接口设置了一个获取技能释放位置的函数,所以我们可以通过获取到设置的位置,生成一个碰撞球体,判断是否和目标产生重叠实现攻击并应用GE。
在这里插入图片描述
但是当前函数无法在蓝图中调用,所以,我们需要修改它,将其变成可以在蓝图中调用的版本

	//获取技能释放位置,通过在蓝图中设置获取WeaponTipSocketName的位置
	UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
	FVector GetCombatSocketLocation() const;

并将cpp的实现删除。

在角色基类修改它的继承,修改成GetCombatSocketLocation_Implementation

virtual FVector GetCombatSocketLocation_Implementation() const override;

并将实现代码函数名称也修改掉

FVector ARPGCharacter::GetCombatSocketLocation_Implementation() const
{
	return Weapon->GetSocketLocation(WeaponTipSocketName);
}

完成以后,就可以编译打开UE,并设置它的WeaponTipSocketName
在这里插入图片描述
这里名称,我们可以在武器骨骼上面增加插槽实现
在这里插入图片描述
接着在技能蓝图里,我们首先实现接收到事件后绘制一个调试球体,来表现攻击范围
在这里插入图片描述
运行查看释放能够正确绘制出调试球体
在这里插入图片描述
我们在点击实现角色攻击时,发现一个问题,有个地方报错了,提示我们不要在接口中直接调用Event函数。而是调用Execute_GetCombatSocketLocation。
在这里插入图片描述
往前定位发现是在调用,直接调用获取位置,由于前面我们将其修改成了蓝图编译生成函数,所以在C++里面不能够直接调用
在这里插入图片描述
所以我们修改此行代码为使用Execute_GetCombatSocketLocation调用

const FVector SocketLocation = ICombatInterface::Execute_GetCombatSocketLocation(GetAvatarActorFromActorInfo());

接着运行测试就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/666663.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

让ChatGPT成为自己的旅游顾问

不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。 大家好&#xff0c;我是闲鹤&#xff0c;公众号 xxh_zone&#xff0c;十多年开发、架构经验&#xff0c;先后在华为、迅雷服役过&#xff0c;也在高校从事教学3年&#xff1b;目前已创业了7年多&a…

桃金娘T2T基因组-文献精读17

Gap-free genome assembly and comparative analysis reveal the evolution and anthocyanin accumulation mechanism of Rhodomyrtus tomentosa 无缺口基因组组装及比较分析揭示了桃金娘的进化和花青素积累机制 摘要 桃金娘&#xff08;Rhodomyrtus tomentosa&#xff09;是…

安装Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…

Flutter中如何让Android的手势导航栏完全透明?

Flutter 开发中 安卓机器都有 像ios 的手势操作栏&#xff0c; 也就是屏幕底下的 那条线。 但这条线默认是有颜色的 &#xff08;像下面这样&#xff09; 一、全屏幕方式 void main() {// 全屏沉浸式SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []…

iOS ------ 多线程 GCD

一&#xff0c;GCD简介 GCD是Apple开发的一个多线程的较新的解决方案。它主要用于优化应用程序以支持多核处理器以及其他对称处理系统。它是一个在线程池模式的基础上执行的并发任务。 为什么要使用GCD&#xff1f; GCD&#xff01;可用于多核的并行运算GCD会自动利用更多的…

【学习Day3】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.5.4 Cache替换算法 Cache的页面淘汰算法 常用替换算法有&#xff1a; • 随机替换算法RA…

方差分析的七种类型

方差分析&#xff08;ANOVA&#xff09;是一种用于检验两个以上样本均数差别的显著性统计方法。根据不同的研究设计和数据类型&#xff0c;方差分析可以分为以下7种类型。 一、单因素方差分析 ①单因素方差分析说明 单因素方差分析用于研究一个定类数据&#xff08;自变量&am…

开发一个SDK(starter)

1.创建项目 将pom.xml中build删除掉

用容器构建wordpress项目

用容器构建wordpress项目 #准备两个镜像 #数据库和centos docker pull mysql:5.7 docker pull centos:7 #创建一个wordpress文件夹&#xff0c;在wordpress文件里面写一个Dockerfile文件 vim DockerfileFROM centos:7 #基于centos环境RUN yum -y install epel-release ;\ #安装…

http协议及httpd安装组成

文章目录 一、http协议http协议通信过程http相关技术网站访问量HTTP工作机制HTTP协议版本HTTP请求访问的完整过程HTTP报文头部响应报文 二、httpd安装组成apache介绍和特点工作模式&#xff08; MPM multi-processing module &#xff09;Http相关文件Http编译安装httpd常见配置…

文件系统小册(FusePosixK8s csi)【1 Fuse】

文件系统小册&#xff08;Fuse&Posix&K8s csi&#xff09;【1 Fuse&#xff1a;用户空间的文件系统】 Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持&#xff0c;开发者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文…

Unity中的MVC框架

基本概念 MVC全名是Model View Controller 是模型(model)-视图(view)-控制器(controller)的缩写 是一种软件设计规范&#xff0c;用一种业务逻辑、数据、界面显示 分离的方法组织代码 将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户交互的同时&#x…

tinycudann安装

在安装完torch等 直接运行下面的指令会出现错误 pip install githttps://github.com/NVlabs/tiny-cuda-nn/#subdirectorybindings/torch大部分错误是下面的 大概看了一下都是因为虚拟环境里面的include文件下缺少文件&#xff0c;将之前的一些.h文件全部复制过来在执行上面的…

TransmittableThreadLocal原理

1、原理 TransmittableThreadLocal&#xff08;简称TTL&#xff09;是阿里巴巴开源的一个Java库&#xff0c;用于解决线程池中线程本地变量传递的问题。其底层原理主要是基于Java的ThreadLocal机制并对其进行扩展&#xff0c;以支持在父子线程间以及线程池中任务切换时&#x…

Java实现顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

Adobe AntiCC 简化版 安装教程

Adobe AntiCC 简化版 安装教程 原文地址&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139277743

TensorFlow Playground神经网络演示工具使用方法详解

在现代机器学习领域,神经网络无疑是一个重要的研究方向。然而,对于许多初学者来说,神经网络的概念和实际操作可能显得相当复杂。幸运的是,TensorFlow Playground 提供了一个交互式的在线工具,使得我们可以直观地理解和实验神经网络的基本原理。在这篇博客中,我们将详细介…

解读vue3源码-2

提示&#xff1a;看到我 请让滚去学习 vue3编译模版的提升 文章目录 vue3编译模版的提升静态节点提升补丁标志和block的使用附录&#xff1a; template explorer可以将我们的源模版转化成渲染函数代码&#xff0c;vue2中就有&#xff0c;而Vue3 template explorer 功能更加丰富…

开发nfc读卡器应用出现报错Unhandled Exception: SCARD_E_NO_SERVICE

使用flutter开发ACR122U的nfc读卡器的时候&#xff0c;报错&#xff1a; [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Exception: Error while establing context. Reason: SCARD_E_NO_SERVICE #0 PCSCBinding._checkAndThrow (package:fl…

Vue 框选区域放大(纯JavaScript实现)

需求&#xff1a;长按鼠标左键框选区域&#xff0c;松开后放大该区域&#xff0c;继续框选继续放大&#xff0c;反向框选恢复原始状态 实现思路&#xff1a;根据鼠标的落点&#xff0c;放大要显示的内容&#xff08;内层盒子&#xff09;&#xff0c;然后利用水平偏移和垂直偏…