《UE5_C++多人TPS完整教程》学习笔记31 ——《P32 角色移动(Character Movement)》

news2024/11/26 18:47:30

本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P32 角色移动(Character Movement)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。


文章目录

  • P32 角色移动
  • 32.1 修改输入映射并绑定到角色蓝图类上
  • 32.2 Summary


P32 角色移动

本节课将为我们创建的第三人称射击游戏角色蓝图类进行输入配置(包括操作映射和轴映射),并将它们绑定到角色蓝图类上,以实现角色的移动功能。
在这里插入图片描述


32.1 修改输入映射并绑定到角色蓝图类上

  1. 在虚幻引擎中打开项目 “Blaster” 的 “项目设置” 窗口,找到 “引擎 - 输入” 选项卡,可以看到我们在迁移资产时自动创建的一些操作映射和轴映射。
    在这里插入图片描述

  2. 删除这些操作映射和轴映射,并添加新的操作映射和轴映射。
    在这里插入图片描述

  3. 在 VS 中打开 “BlasterCharacter.h”,声明与上述轴映射相对应的函数为 “ABlasterCharacter” 类的保护成员函数。

    ...
    
    UCLASS()
    class BLASTER_API ABlasterCharacter : public ACharacter
    {
    	
    	...
    
    protected:
    	// Called when the game starts or when spawned
    	virtual void BeginPlay() override;
    	
    	/* P32 角色移动(Character Movement)*/
    	// 与轴映射相对应的函数
    	void MoveForward(float Value);	// 角色前进或后退
    	void MoveRight(float Value);	// 角色左移或右移
    	void Turn(float Value);			// 角色视角左转或右转
    	void LookUp(float Value);		// 角色俯视或仰视
    	/* P32 角色移动(Character Movement)*/
    	
    private:
    	UPROPERTY(VisibleAnywhere, Category = Camera)	
    	class USpringArmComponent* CameraBoom;			// 添加弹簧臂组件,归类为 “Camera”
    
    	UPROPERTY(VisibleAnywhere, Category = Camera)
    	class UCameraComponent* FollowCamera;			// 添加摄像机组件,归类为 “Camera”
    
    public:	
    
    
    };
    
    

    在头文件中鼠标左键单击函数名,即可出现 在这里插入图片描述 按钮,鼠标左键单击该按钮,就可以在弹出的下拉菜单栏中选择快速创建函数的定义到 cpp 文件。
    在这里插入图片描述

  4. 在 “BlasterCharacter.cpp” 中完成与轴映射相对应的函数的定义。

    /* P32 角色移动(Character Movement)*/
    // 角色前进或后退
    void ABlasterCharacter::MoveForward(float Value)
    {
    	if (Controller != nullptr && Value != 0.f) {
    		// const FVector Direction = GetActorForwardVector();							// 使用 GetActorForwardVector() 获取的是角色胶囊体的前后方向向量,而我们想要通过获取角色控制器的前后方向向量来控制角色前进
    		const FRotator YawRotation(0.f, Controller->GetControlRotation().Yaw, 0.f);		// 获取角色控制器的航向
    		const FVector Direction(FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X));	// 使用角色控制器的航向获取前后方向向量。
    																						// FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X) 可以获取 FRotationMatrix 在 X 轴上的向量
    		AddMovementInput(Direction, Value);												// 添加移动输入,移动方向为角色控制器的前后方向
    	}
    }
    
    // 角色左移或右移
    void ABlasterCharacter::MoveRight(float Value)
    {
    	if (Controller != nullptr && Value != 0.f) {
    		const FRotator YawRotation(0.f, Controller->GetControlRotation().Yaw, 0.f);		// 获取角色控制器的航向
    		const FVector Direction(FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y));	// 使用角色控制器的航向获取左右方向向量。
    		AddMovementInput(Direction, Value);												// 添加移动输入,移动方向为角色控制器的左右方向
    	}
    }
    
    // 角色视角左转或右转
    void ABlasterCharacter::Turn(float Value)
    {
    	AddControllerYawInput(Value);	// 添加角色控制器的航向输入
    }
    
    // 角色视角俯视或仰视
    void ABlasterCharacter::LookUp(float Value)
    {
    	AddControllerPitchInput(Value);	// 获取角色控制器的俯仰输入
    }
    /* P32 角色移动(Character Movement)*/
    

    注意这里要了解 “pitch”、“yaw”、“roll” 三个欧拉角的含义,便于看懂代码,可以参阅《pitch、yaw、roll三个角的区别》

  5. 在 “BlasterCharacter.cpp” 的 “SetupPlayerInputComponent()” 函数中将角色跳跃对应的函数 “ACharacter::Jump” 与相应的操作映射进行绑定,然后将上述与轴映射相对应的函数与轴映射进行绑定。最后进行编译即可。

    // Called to bind functionality to input
    void ABlasterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
    {
    	Super::SetupPlayerInputComponent(PlayerInputComponent);
    	
    	/* P32 角色移动(Character Movement)*/
    	// 绑定操作映射
    	PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
    
    	// 绑定轴映射
    	PlayerInputComponent->BindAxis("MoveForward", this, &ABlasterCharacter::MoveForward);
    	PlayerInputComponent->BindAxis("MoveRight", this, &ABlasterCharacter::MoveRight);
    	PlayerInputComponent->BindAxis("Turn", this, &ABlasterCharacter::Turn);
    	PlayerInputComponent->BindAxis("LookUp", this, &ABlasterCharacter::LookUp);
    	/* P32 角色移动(Character Movement)*/	
    }
    
  6. 在虚幻引擎中打开关卡 “Lobby” ,点击上方工具栏的 “播放”(▶)按钮,可以观察到我们能够使用键盘和鼠标控制角色的移动和视角,但是角色的移动和视角变化都很僵硬,这是因为我们还没有为角色添加动画。
    在这里插入图片描述
    在这里插入图片描述


32.2 Summary

本节课修改输入映射(包括操作映射和轴映射),并定义了与其对应的 C++ 函数,然后绑定到角色蓝图类上,实现了使用键盘和鼠标控制角色移动和视角的功能。
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用国内版Devin:DevOpsGPT开发一个简易官网

前言: 世界上第一个AI程序员Devin想必已经给大家带来了不小的震撼,这种L4级的技术也许已经昭示着AGI离我们或许真的不远了。 这里先给大家普及一个概念: L4是谷歌对AGI划分的第四个等级,把代码丢给 AI 改这个是 L1 或者 L2 级别的…

CentOS7安装Docker及禅道

https://blog.csdn.net/weixin_46453070/article/details/136183615?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171246925816800222886233%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id171246925816800222886233&biz_i…

基于RTThread的学习(三):正点原子潘多拉 QSPI 通信 W25Q128 实验

1、基于芯片创建工程 2、QSPI配置 2.1、RTThing_setting 设置组件 2.2、配置board.h 文件 2.3、cubemx生成QSPI的硬件初始化代码;HAL_QSPI_MapInit; 这里注意:你所买的开发板对应的qspi 连接的是否是cubemx 上边显示的,如果不是你需要将引脚…

Spring Security——13,认证成功失败注销成功处理器

认证成功&&失败&&注销成功处理器 说明:一、认证成功处理器1.1 自定义成功处理器1.2 配置自定义成功处理器 二、认证失败处理器2.1 自定义失败处理器2.2 配置自定义失败处理器 三、登出成功处理器3.1 自定义登出处理器3.2 配置登出处理器 四、完结撒…

聊一聊,JMeter分布式性能测试!

在做后端服务器性能测试中,我们会经常听到’分布式’。但你是否了解分布式呢?今天,我们就来给大家讲讲,在企业实战中,如何使用分布式进行性能测试,实战过程中,又有哪些地方要特别注意&#xff1…

Inotify

一、关于Inotify linux内核的inotify机制 可以监测文件系统的变动情况,并做出通知响应 二、关于inotify 使用inotify通知接口,可以用来监控文件系统的各种变化情况,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的…

transformer上手(1) —— transformer介绍

1 起源与发展 2017 年 Google 在《Attention Is All You Need》中提出了 Transformer 结构用于序列标注,在翻译任务上超过了之前最优秀的循环神经网络模型;与此同时,Fast AI 在《Universal Language Model Fine-tuning for Text Classificat…

烤羊肉串引来的思考--命令模式

1.1 吃羊肉串! 烧烤摊旁边等着拿肉串的人七嘴八舌地叫开了。场面有些混乱,由于人实在太多,烤羊肉串的老板已经分不清谁是谁,造成分发错误,收钱错误,烤肉质量不过关等。 外面打游击烤羊肉串和这种开门店做烤…

Windows系统下安装java开发环境所需的JDK开发工具包

目录 一、JDK开发工具包下载二、安装三、环境变量配置3.1 添加安装包路径3.2 添加lib路径3.3 添加bin目录 四、检查是否安装成功五、总结 一、JDK开发工具包下载 官网地址:JDK下载 打开网址后有多个版本的JDK,学者根据自己电脑需求选择对应版本下载。如…

类,构造,this,static

第1关:什么是类,如何创建类 100 任务要求参考答案 任务描述相关知识 什么是类怎么定义类创建对象并且使用对象的属性和方法编程要求测试说明 任务描述 本关任务:创建一个类和一个对象,调用这个对象的属性和方法。 相关知识 …

34-5 CSRF漏洞 - CSRF分类

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 1)GET 类型 传参: 参数连接在URL后面 POC构造及执行流程: 构造URL,诱导受害者访问点击利用利用标签进行攻击: 构造虚假URL,在链接上添加payload抓包获取数据包,通过CSRF POC…

解决Xshell连接Linux虚拟机速度慢问题

我们频繁更换网络环境时,可能会发现xshell连接Linux虚拟机的速度变得很慢 为什么呢? 因为ssh的服务端在连接时会自动检测dns环境是否一致导致的 我们把它修改为不检测即可 修改文件位置: vi /etc/ssh/sshd_config 把 #UseDNS yes 修改…

Redis7(二)数据类型及其用法

一、概述 命令不区分大小写&#xff0c;key区分大小写 数据类型针对value String List Set Hash ZSet bitmap GEO HyperLogLog Stream bitfield 二、String <K,V> 1、设值/取值 getrange key index1 index2 getrange key 0 -1//获取所有的值 SETRANGE KEY_N…

代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 贪心算法&#xff0c;这不就是常识&#xff1f;还能叫贪心&#xff1f;LeetCode&#xff1a;1005.K次取反后最大化的数组和_哔哩哔…

如何选择苹果iOS系统的企业签名分发平台

哈喽&#xff0c;大家好呀&#xff0c;淼淼有和大家见面啦&#xff0c;前两期讲了分发内测的一些相关知识&#xff0c;这一期咱们来聊聊企业签名分发平台的相关知识。最近移动应用市场的竞争一天比一天要激烈&#xff0c;许多做开发的小伙伴们都在为此发愁&#xff0c;愁着该怎…

不要再使用 @Builder 注解了!有深坑呀!

曾经&#xff0c;我在《千万不要再随便使用 lombok 的 Builder 了&#xff01;》 一文中提到 Builder 注解的其中一个大坑会导致默认值失效&#xff01; 最近阅读了 《Oh !! Stop using Builder》 发现 Builder 的问题还不止一个&#xff0c;Builder 会让人误以为是遵循构建器…

java的封装

在Java中&#xff0c;封装是面向对象编程中的一种重要概念&#xff0c;它指的是将数据和方法打包在一个单一的单位&#xff08;类&#xff09;中&#xff0c;并对外部隐藏对象的内部细节。封装通过将类的成员变量声明为私有的&#xff0c;并提供公共的方法来访问和修改这些变量…

数据库关系模式三元及以上分解无损连接判断(表格法)

例题 1.首先构造初始表&#xff0c;如下表所示。 A B C D E ABC a1 a2 a3 b14 b15 CD b21 b22 a3 a4 b15 DE b31 b32 b33 a4 a5 2.遍历函数依赖&#xff0c;对AB→C&#xff0c;因各元组的第一、二列没有相同的分量&#xff0c;所以表不改变。 3.由C→D…

【日常记录】【JS】getComputedStyle 获取DOM的最终样式值

文章目录 1、介绍2、getComputedStyle3、链接 1、介绍 Window.getComputedStyle()方法返回一个对象&#xff0c;该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有 CSS 属性的值。私有的 CSS 属性值可以通过对象提供的 API 或通过简单地使用 CSS 属性…

指针的深入理解(六)

指针的深入理解&#xff08;六&#xff09; 个人主页&#xff1a;大白的编程日记 感谢遇见&#xff0c;我们一起学习进步&#xff01; 文章目录 指针的深入理解&#xff08;六&#xff09;前言一. sizeof和strlen1.1sizeof1.2strlen1.3sizeof和strlen对比 二.数组名和指针加减…