UE5 C++(十三)— 创建Character,添加增强输入

文章目录

  • 创建Character第三人称模板
  • 添加增强输入引用
  • 在脚本中实现移动、旋转

创建Character第三人称模板

创建MyCharacter C++类
在这里插入图片描述
在这里插入图片描述

添加增强输入引用

在DEMO.Build.cs 脚本中添加增强输入模块
在这里插入图片描述
有个容易出错的点,这里的设置一定要正确
在这里插入图片描述
然后添加引用到C++头文件中

#include "InputActionValue.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"

最后,可以编译一下,看看输入模块(“EnhancedInput” )是否引入成功。

在脚本中实现移动、旋转

首先,是头文件添加引用
MyCharacter.h

#pragma once#include "CoreMinimal.h"
#include "InputActionValue.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"UCLASS()
class DEMO_API AMyCharacter : public ACharacter
{GENERATED_BODY()public:// Sets default values for this character's propertiesAMyCharacter();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:// Called every framevirtual void Tick(float DeltaTime) override;// Called to bind functionality to inputvirtual void SetupPlayerInputComponent(class UInputComponent *PlayerInputComponent) override;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MySceneComponent")USpringArmComponent *MySpringArm;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MySceneComponent")UCameraComponent *MyCamera;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")class UInputMappingContext *DefaultMappingContext;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")class UInputAction* MoveAction;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")class UInputAction* LookAction;void Move(const FInputActionValue& Value);void Look(const FInputActionValue& Value);
};

然后在MyCharacter.cpp中实现

// Fill out your copyright notice in the Description page of Project Settings.#include "MyCharacter.h"// Sets default values
AMyCharacter::AMyCharacter()
{// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;MySpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("MySpringArm"));MyCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("MyCamera"));MySpringArm->SetupAttachment(RootComponent);MyCamera->SetupAttachment(MySpringArm);MySpringArm->TargetArmLength = 300.0f;// 这么设置是为了让控制器的转动不影响角色的转动,只影响摄像机的转动bUseControllerRotationYaw = false;bUseControllerRotationPitch = false;bUseControllerRotationRoll = false;// 为了让角色的移动方向与摄像机的方向一致,需要设置以下参数GetCharacterMovement()->bOrientRotationToMovement = true;// 这是为了使用Pawn的控制器旋转MySpringArm->bUsePawnControlRotation = true;
}// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{Super::BeginPlay();APlayerController *PlayerController = Cast<APlayerController>(GetController());if (PlayerController){UEnhancedInputLocalPlayerSubsystem *LocalPlayerSubsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());if (LocalPlayerSubsystem){LocalPlayerSubsystem->AddMappingContext(DefaultMappingContext, 0);}}
}// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent *PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);if (UEnhancedInputComponent *EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent)){EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::Move);EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::Look);}
}void AMyCharacter::Move(const FInputActionValue &Value)
{FVector2D MoveVector = Value.Get<FVector2D>();if (Controller != nullptr){const FRotator Rotation = Controller->GetControlRotation();const FRotator YawRotation(0, Rotation.Yaw, 0);const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);AddMovementInput(ForwardDirection, MoveVector.Y);AddMovementInput(RightDirection, MoveVector.X);}
}void AMyCharacter::Look(const FInputActionValue &Value)
{FVector2D LookVector = Value.Get<FVector2D>();if (Controller == nullptr){return;}AddControllerYawInput(LookVector.X);AddControllerPitchInput(LookVector.Y);
}

编译之后,创建蓝图类BP_MyCharacter
在这里插入图片描述
这时候会有默认组件,缺少人物模型,我们可以在这里添加
在这里插入图片描述
添加动画蓝图类
在这里插入图片描述
其他设置
在这里插入图片描述
在这里插入图片描述

最后,拖到场景中,把WorldSetting -> Game Mode 设置为null
在这里插入图片描述
点击运行,就可以实现鼠标,键盘第三人称操作了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于WEB的文学网的设计与实现+vue论文

基于WEB的文学网的设计与实现 摘要 如今&#xff0c;科学技术的力量越来越强大&#xff0c;通过结合较为成熟的计算机技术&#xff0c;促进了学校、医疗、商城等许多行业领域的发展。为了顺应时代的变化&#xff0c;各行业结合互联网、人工智能等技术&#xff0c;纷纷开展了管…

时间序列数据库选型: influxdb; netdiscover列出docker实例们的ip

influxdb influxdb: 有收费版本、有开源版本 docker run -itd --name influxdb-dev -p 8086:8086 influxdb #influxdb的web客户端(端口8003)被去掉了 #8006是web-service端口docker pull chronograf docker run -d -p 8888:8888 --name chronograf-dev chronografsudo netst…

【VRTK】【Unity】【VR开发】Linear Drives

课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 前面一篇讨论了角度运动机制,本篇讨论线性运动机制。和角度运动机制类似,线性运动机制提供了更为仿真的互动机制。也分为基于物理的和不基于…

DDPM之反向传播

反向过程&#xff1a;由噪声状态恢复到数据状态的过程这一过程可以用条件概率来描述 是在时间步 t−1 想要恢复的数据状态。 是在时间步 t 的当前噪声状态。条件概率 p 服从高斯分布&#xff1a; 条件概率 是模型根据当前噪声状态 xt​ 和时间步 t 估计的均值是估计的方差和是由…

JVM,JRE,JDK的区别和联系简洁版

先看图 利用JDK&#xff08;调用JAVA API&#xff09;开发JAVA程序后&#xff0c;通过JDK中的编译程序&#xff08;javac&#xff09;将我们的文本java文件编译成JAVA字节码&#xff0c;在JRE上运行这些JAVA字节码&#xff0c;JVM解析这些字节码&#xff0c;映射到CPU指令集或…

工作中太在意领导的看法怎么办?

文章首发于公众号&#xff1a;字节流动&#xff0c;未经作者&#xff08;微信ID&#xff1a;Byte-Flow&#xff09;允许&#xff0c;禁止转载 来自我的知识星球【精通 OpenGL ES】一位读者的提问&#xff1a; 你好星主&#xff0c;工作中太在意领导的看法怎么办&#xff1f; 目…

异常检测的资料

(1) (2) (3)

体系结构汇总复习(练习题)

1.MSI cache一致性协议问题 题解引用自&#xff1a;MSI cache一致性协议_假设在一个双cpu多处理器系统中,两个cpu用单总线连接,并且采用监听一致性协议(msi-CSDN博客 答&#xff1a; 事件A状态B状态初始状态IICPU A读SICPU A写MICPU B写IMCPU A读SS 接下来分析CPU A/B中各自c…

大数据Doris(四十九):Doris数据导出介绍

文章目录 Doris数据导出介绍 一、使用示例

博捷芯BJCORE:划片机行业背景、发展历史、现状及趋势

划片机行业背景、发展历史、现状及趋势 随着科技的快速发展&#xff0c;半导体制造已成为电子设备行业的核心驱动力。在这个技术革新的浪潮中&#xff0c;中国半导体产业迅速崛起&#xff0c;不断突破技术壁垒&#xff0c;逐渐成为全球半导体市场的重要参与者。作为半导体制造…

软件测试|Python对JSON的解析和创建详解

简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;已经成为当今互联网应用中广泛使用的数据格式之一。Python提供了内置的模块来解析和创建JSON数据&#xff0c;使得在Python中处理JSON变得非常简单。本文将详细介绍Python…

模集 - 240105 - 模集期末速成

TAG - 模集、期末、速成 模集、期末、速成 模集、期末、速成 // – 高数帮 - 期末速成 – //阈值电压晶体管工作区及其判断方法电路公式//体效应沟长调制效应亚阈值效应…// – 阶段考核1 – //集成电路的优势与特点&#xff1a;体积小、速度快、功耗低、电路中以晶体管为主&a…