112. UE5 GAS RPG 制作高亮接口

我们在之前,实现过高亮的效果,之前,高亮只用在了敌人身上,鼠标悬停到敌人身上时,敌人身上能够出现红色的描边。在这一篇里,我们想将高亮描边功能单独成为一个接口,能够将其应用到更多地方。

首先我们回忆一下之前如何实现此功能,此功能需要使用自定义深度来实现,通过后处理,我们需要开启自定义深度,在项目设置-渲染里找到。

在场景里添加后处理体积,并在后期处理材质里添加自定义的材质。

这个材质有两个地方我们可以去修改,如果需要的小伙伴可以通过加群获取

一个是修改描边大小

另一个是设置自定义数值对应的颜色

创建高亮接口

先创建一个新的接口

命名为高亮接口

将之前敌人接口里的开启和关闭高亮的的函数移动到高亮接口里来,并将其设置为蓝图类型,以后在蓝图中也可以实现对应的添加接口的操作。

敌人接口的对应的高亮相关函数可以去掉了。

cpp 复制代码
// 版权归暮志未晚所有。

#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顶部增加一个枚举,这里指定了类型,不会污染全局命名,缺点就是指定时需要携带枚举类。

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

接着我们修改鼠标拾取的相关参数

我们首先修改CursorTrace函数,这个函数会在每次帧更新里调用,用于鼠标拾取。

代码与之前相比主要是鼠标拾取到了对象,我们要转换为高亮接口,Actor高亮也是通过接口去调用。

cpp 复制代码
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的类型,设置不同的状态

cpp 复制代码
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里,测试检查点是否实现了描边功能。

相关推荐
花花鱼9 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
alexhilton10 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
AirDroid_cn13 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
尊治13 小时前
手机电工仿真软件更新了
android
xiangzhihong816 小时前
使用Universal Links与Android App Links实现网页无缝跳转至应用
android·ios
车载应用猿17 小时前
基于Android14的CarService 启动流程分析
android
远离UE417 小时前
UE 材质 变体 概念
ue5·材质
没有了遇见18 小时前
Android 渐变色实现总结
android
雨白20 小时前
Jetpack系列(四):精通WorkManager,让后台任务不再失控
android·android jetpack
mmoyula1 天前
【RK3568 驱动开发:实现一个最基础的网络设备】
android·linux·驱动开发