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

虚幻引擎5 GAS开发俯视角RPG游戏 P07-06 能力输入的回调

1.调整一下输入资产,将输入映射上下文添加进去:

2.新增自定义输入组件,创建函数BindAbilityAction:

Source/CC_Aura/Public/Input/CC_InputComponent.h

// 版权归陈超所有#pragma once#include "CoreMinimal.h"
#include "DataAsset_InputConfig.h"
#include "EnhancedInputComponent.h"
#include "CC_InputComponent.generated.h"class UDataAsset_InputConfig;
/*** */
UCLASS()
class CC_AURA_API UCC_InputComponent : public UEnhancedInputComponent
{GENERATED_BODY()
public:template<class UserObject, typename CallbackFunc>void BindAbilityAction(const UDataAsset_InputConfig* InInputConfig, const FGameplayTag& InInputTag, ETriggerEvent TriggerEvent ,UserObject* ContextObject, CallbackFunc Func);
};template <class UserObject, typename CallbackFunc>
void UCC_InputComponent::BindAbilityAction(const UDataAsset_InputConfig* InInputConfig, const FGameplayTag& InInputTag,ETriggerEvent TriggerEvent, UserObject* ContextObject, CallbackFunc Func)
{checkf(InInputConfig, TEXT("[%s]里的InInputConfig为空指针,无法继续执行绑定操作!"),*GetName());UInputAction* InputAction = InInputConfig->GetInputActionByTag(InInputTag);if (InputAction == nullptr) return;BindAction(InputAction, TriggerEvent, ContextObject, Func);
}

在编辑器项目设置里,将"默认输入组件类"改成自己的输入组件类:

3.在CC_PlayerController.h中添加输入数据资产,顺便把其他的输入映射上下文和输入动作删除:

// 版权归陈超所有#pragma once#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "CC_PlayerController.generated.h"class UDataAsset_InputConfig;
class ICC_EnemyInterface;
class UInputMappingContext;
class UInputAction;/*** */
UCLASS()
class CC_AURA_API ACC_PlayerController : public APlayerController
{GENERATED_BODY()public:ACC_PlayerController();virtual void PlayerTick(float DeltaTime) override;
protected:virtual void BeginPlay() override;#pragma region CurserTrace
private://鼠标追踪变量TScriptInterface<ICC_EnemyInterface> LastActor;	//上一帧拾取的接口指针TScriptInterface<ICC_EnemyInterface> ThisActor;	//当前帧拾取的接口指针void CurserTrace();	//鼠标追踪函数
#pragma endregion#pragma region Inputs
protected:virtual void SetupInputComponent() override;
private:UPROPERTY(EditAnywhere, Category="CC|Input")TObjectPtr<UDataAsset_InputConfig> DataAssetInputConfig;void Move(const struct FInputActionValue& InputActionValue);
#pragma endregion};

Source/CC_Aura/Private/Player/CC_PlayerController.cpp

源码:

// 版权归陈超所有#include "Player/CC_PlayerController.h"#include "CC_GameplayTags.h"
#include "EnhancedInputSubsystems.h"
#include "EnhancedInputComponent.h"
#include "Input/CC_InputComponent.h"
#include "Interations/CC_EnemyInterface.h"ACC_PlayerController::ACC_PlayerController()
{bReplicates = true;		//确保可复制
}void ACC_PlayerController::PlayerTick(float DeltaTime)
{Super::PlayerTick(DeltaTime);CurserTrace();}//鼠标位置追踪
void ACC_PlayerController::CurserTrace()
{FHitResult CursorHit;GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);	//获取可视的鼠标命中结果if(!CursorHit.bBlockingHit) return; //如果未命中直接返回LastActor = ThisActor;ThisActor = CursorHit.GetActor();/*** 射线拾取后,会出现的几种情况* 1. LastActor is null   ThisActor is null 不需要任何操作* 2. LastActor is null   ThisActor is valid 高亮ThisActor* 3. LastActor is valid   ThisActor is null 取消高亮LastActor* 4. LastActor is valid   ThisActor is valid LastActor != ThisActor 取消高亮LastActor 高亮ThisActor* 5. LastActor is valid   ThisActor is valid LastActor == ThisActor 不需要任何操作*/if(LastActor == nullptr){if(ThisActor != nullptr){//case 2ThisActor->HighlightActor();} // else case 1}else{if(ThisActor == nullptr){//case 3LastActor->UnHighlightActor();}else{if(LastActor != ThisActor){//case 4LastActor->UnHighlightActor();ThisActor->HighlightActor();} //else case 5}}	
}void ACC_PlayerController::BeginPlay()
{Super::BeginPlay();/*check(CCContext);//判断增强输入映射情境是否存在//从本地角色身上获取到它的子系统UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());// check(Subsystem);//检查子系统是否存在if (Subsystem){Subsystem->AddMappingContext(CCContext,0);//子系统配置情境}*///设置鼠标光标bShowMouseCursor = true; //游戏中是否显示鼠标光标DefaultMouseCursor = EMouseCursor::Default; //鼠标光标的样式FInputModeGameAndUI InputModeData;InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock); //将鼠标锁定在视口内InputModeData.SetHideCursorDuringCapture(false); //鼠标被捕获时是否隐藏SetInputMode(InputModeData); //设置给控制器}//设置输入组件函数(重载)
void ACC_PlayerController::SetupInputComponent()
{Super::SetupInputComponent();checkf(DataAssetInputConfig,TEXT("DataAssetInputConfig 指针为空!"));UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());if(Subsystem == nullptr) return;//添加映射上下文Subsystem->AddMappingContext(DataAssetInputConfig->DefaultMappingContext, 0);UCC_InputComponent* CC_InputComponent = CastChecked<UCC_InputComponent>(InputComponent); //将InputComponent转换成增强输入组件CC_InputComponent->BindAbilityAction(DataAssetInputConfig, CC_GameplayTags::Input_Move, ETriggerEvent::Triggered, this, &ThisClass::Move); //绑定移动事件
}//移动事件的返回函数
void ACC_PlayerController::Move(const struct FInputActionValue& InputActionValue)
{const FVector2D InputAxisVector = InputActionValue.Get<FVector2D>(); //获取输入操作的2维向量值const FRotator Rotation = GetControlRotation(); //获取控制器旋转const FRotator YawRotation(0.f, Rotation.Yaw, 0.f); //通过控制器的垂直朝向创建一个旋转值,忽略上下朝向和左右朝向const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); //获取向前的值(旋转矩阵)const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); //获取向右的值,-1到1if(APawn* ControlledPawn = GetPawn<APawn>()){ControlledPawn->AddMovementInput(ForwardDirection, InputAxisVector.Y);ControlledPawn->AddMovementInput(RightDirection, InputAxisVector.X);}}

在编辑器玩家控制器类中,添加输入配置资产:

http://www.dtcms.com/a/574395.html

相关文章:

  • 中企动力做网站贵吗wordpress wp-cumulus
  • 网站没有备案信息该怎么做气象网站建设
  • 6 AutoGen 多 Agent 协作框架:构建智能团队协作系统
  • 昆明做商城网站多少钱网站统计功能设计
  • 优秀个人网站图片如何建立一个小程序的网站
  • 对比28种时间序列预测算法在某个数据集上的表现-全套源码
  • LibreTorrent 4.0.1 | 一款开源磁力软件,不限速,支持RSS
  • 电子商务网站建设与管理的总结做网站用哪种语言好
  • 阿里巴巴网站策划书全球速卖通网址
  • 电子商务网站建设风格seo优化公司
  • 营销网站建设资料扫码支付做进商城网站
  • 10.进程间通信(四)
  • STM32项目分享:智能书桌
  • 做网站怎样做做标书的网站
  • 计算机视觉·LDVC
  • 如何用抽象语法树工具ast解析str格式的文本数据
  • 商务网站开发流程建站之星和凡科
  • 龙岗企业网站建设北京网站开发哪里好薇
  • 宿迁哪里有做网站开发的wordpress 维基
  • 手机号网站源码网站源码本地演示
  • Twitter热点追踪--互动飙升
  • 安徽省级建设主管部门网站网站结构说明
  • 科技设计网站十堰网站建设专家
  • 大恒相机-mono12-python示例程序
  • 线程池和单例模式
  • 建站全过程品牌网站建站
  • Linux之rsyslog(3)模板配置
  • 做网站只用前端知识可以吗热点新闻
  • 免费夸克网盘不限速下载简单方法
  • 本地部署网站流量分析工具 Matomo 并实现外部访问