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

112. UE5 GAS RPG 制作高亮接口

我们在之前,实现过高亮的效果,之前,高亮只用在了敌人身上,鼠标悬停到敌人身上时,敌人身上能够出现红色的描边。在这一篇里,我们想将高亮描边功能单独成为一个接口,能够将其应用到更多地方。
首先我们回忆一下之前如何实现此功能,此功能需要使用自定义深度来实现,通过后处理,我们需要开启自定义深度,在项目设置-渲染里找到。
在这里插入图片描述
在场景里添加后处理体积,并在后期处理材质里添加自定义的材质。
在这里插入图片描述
这个材质有两个地方我们可以去修改,如果需要的小伙伴可以通过加群获取
一个是修改描边大小
在这里插入图片描述
另一个是设置自定义数值对应的颜色
在这里插入图片描述

创建高亮接口

先创建一个新的接口
在这里插入图片描述
命名为高亮接口
在这里插入图片描述
将之前敌人接口里的开启和关闭高亮的的函数移动到高亮接口里来,并将其设置为蓝图类型,以后在蓝图中也可以实现对应的添加接口的操作。
敌人接口的对应的高亮相关函数可以去掉了。

// 版权归暮志未晚所有。

#pragma once

#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "HighLightInterface.generated.h"

// This class does not need to be modified.
UINTERFACE(MinimalAPI, BlueprintType)
class UHighLightInterface : public UInterface
{
	GENERATED_BODY()
};

/**
 * 
 */
class RPG_API IHighLightInterface
{
	GENERATED_BODY()

	// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
	
	//高亮 描边
	UFUNCTION(BlueprintNativeEvent)
	void HighlightActor();
	
	//取消高亮 描边
	UFUNCTION(BlueprintNativeEvent)
	void UnHighlightActor(); 
};

然后我们先复原之前的敌人红色描边效果,让敌人类继承此接口
在这里插入图片描述
修改继承函数
在这里插入图片描述
将实现里的函数名也修改掉
在这里插入图片描述
接着,我们编译打开蓝图,在蓝图里,实现通过蓝图对检查点添加此功能,需要打开类设置,添加高亮接口
在这里插入图片描述
然后在蓝图事件图标里,实现上面代码实现的功能。如果模型是不可读的,我们需要将指针对象移到protect里,然后添加BlueprintReadOnly标签。
在这里插入图片描述

修改鼠标拾取逻辑

我们想实现更多的拾取功能,需要将PlayerController里的鼠标拾取的逻辑修改掉。
首先我们在PlayerController顶部增加一个枚举,这里指定了类型,不会污染全局命名,缺点就是指定时需要携带枚举类。

//鼠标拾取目标的状态枚举
enum class ETargetingStatus : uint8
{
	//敌人
	TargetingEnemy,
	//鼠标拾取的目标非敌人
	TargetingNonEnemy,
	//无
	NotTargeting
};

接着我们修改鼠标拾取的相关参数
在这里插入图片描述
我们首先修改CursorTrace函数,这个函数会在每次帧更新里调用,用于鼠标拾取。
代码与之前相比主要是鼠标拾取到了对象,我们要转换为高亮接口,Actor高亮也是通过接口去调用。

void ARPGPlayerController::CursorTrace()
{
	//判断当前事件是否被阻挡,如果事件被阻挡,则清除相关内容
	if(GetASC() && GetASC()->HasMatchingGameplayTag(FRPGGameplayTags::Get().Player_Block_CursorTrace))
	{
		if(IsValid(ThisActor)) IHighLightInterface::Execute_UnHighlightActor(ThisActor);
		if(IsValid(LastActor)) IHighLightInterface::Execute_UnHighlightActor(LastActor);
		ThisActor = nullptr; 
		LastActor = nullptr;
		return;
	}

	//如果当前处于魔法范围指示阶段,将忽略掉场景中的角色
	const ECollisionChannel TraceChannel = IsValid(MagicCircle) ? ECC_EXCLUDEPLAYERS_CHANNEL : ECC_Visibility;
	
	GetHitResultUnderCursor(TraceChannel, false, CursorHit); //获取可视的鼠标命中结果
	if(!CursorHit.bBlockingHit) return; //如果未命中直接返回

	LastActor = ThisActor;
	//获取拾取的Actor,判断Actor是否继承高亮接口
	if(IsValid(CursorHit.GetActor()) && CursorHit.GetActor()->Implements<UHighLightInterface>())
	{
		ThisActor = CursorHit.GetActor();
	}
	else
	{
		ThisActor = nullptr;
	}

	//如果两次拾取的目标不同,将修改高亮目标
	if(ThisActor != LastActor)
	{
		if(IsValid(ThisActor)) IHighLightInterface::Execute_HighlightActor(ThisActor);
		if(IsValid(LastActor)) IHighLightInterface::Execute_UnHighlightActor(LastActor);
	}
	
}

接着修改鼠标按下事件,如果鼠标左键按下,根据ThisActor的类型,设置不同的状态

void ARPGPlayerController::AbilityInputTagPressed(const FGameplayTag InputTag)
{
	//处理判断按下事件是否被阻挡
	if(GetASC() && GetASC()->HasMatchingGameplayTag(FRPGGameplayTags::Get().Player_Block_InputPressed))
	{
		return;
	}
	//判断鼠标左键,并处理移动相关
	if(InputTag.MatchesTagExact(FRPGGameplayTags::Get().InputTag_LMB))
	{
		//ThisActor为鼠标悬停在敌人身上才会有值
		if(IsValid(ThisActor))
		{
			if(ThisActor->Implements<UEnemyInterface>())
			{
				//继承敌人接口,目标为敌人
				TargetingStatus = ETargetingStatus::TargetingEnemy;
			}
			else
			{
				//无敌人接口,基本为场景静态物体
				TargetingStatus = ETargetingStatus::TargetingNonEnemy;
			}
		}
		else
		{
			//目标不存在,设置为无目标状态
			TargetingStatus = ETargetingStatus::NotTargeting;
		}

		bAutoRunning = false;
		FollowTime = 0.f; //重置统计的时间
	}
	//调用ASC内创建的键位按下事件
	if(GetASC()) GetASC()->AbilityInputTagPressed(InputTag);
}

鼠标抬起这里,判断状态为非敌人枚举,可以触发寻路逻辑
在这里插入图片描述
而在鼠标按住时,要攻击敌人,则需要判断状态为敌人才可。
在这里插入图片描述
接着在UE里,测试检查点是否实现了描边功能。
在这里插入图片描述


http://www.kler.cn/a/413791.html

相关文章:

  • Flink高可用配置(HA)
  • Android 13 Aosp Settings Android Studio版本
  • C# 泛型(Generic)
  • RTR Chaptor10 上
  • TCP/IP协议攻击与防范
  • Springboot 实现Server-Sent Events
  • WPF的表格控件 FlexGrid设置行的高度自适应
  • 【优选算法】位运算
  • 面经-综合面/hr面
  • shell脚本_不同脚本的互相调用和重定向操作
  • 【Linux】命令行参数与环境变量
  • 微软企业邮箱:安全可靠的企业级邮件服务!
  • C# 反射详解
  • 优先算法 —— 双指针系列 - 有效三角形的个数
  • Kubernetes(k8s)1.30.7简单快速部署对外部开放的有状态服务MYSQL8(快速有效)
  • 【组件封装】uniapp vue3 封装一个自定义下拉刷新组件pullRefresh,带刷新时间和加载动画教程
  • 什么是Git
  • C语言——指针初阶(一)
  • Zookeeper学习心得
  • linux安全管理-日志审计
  • fatal error in include chain (rtthread.h):rtconfig.h file not found
  • 如何设置爬虫的异常处理?(代码示例)
  • 【Leetcode 每日一题】25. K 个一组翻转链表
  • 动态加载Jar包引发的“java.util.zip.ZipException: invalid distance too far back”
  • 定制独立站系统需要哪些技术支持?
  • 不间断电源 (UPS) 对现代技术可靠性的影响