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


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


文章目录

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

P32 角色移动

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


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

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

  2. 删除这些操作映射和轴映射,并添加新的操作映射和轴映射。

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

    cpp 复制代码
    ...
    
    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" 中完成与轴映射相对应的函数的定义。

    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" 与相应的操作映射进行绑定,然后将上述与轴映射相对应的函数与轴映射进行绑定。最后进行编译即可。

    cpp 复制代码
    // 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++ 函数,然后绑定到角色蓝图类上,实现了使用键盘和鼠标控制角色移动和视角的功能。


相关推荐
Escalating_xu2 分钟前
【C语言项目实战】贪吃蛇(下):移动、碰撞与计分,完成一局可玩的游戏
c语言·开发语言·游戏
火2259 分钟前
# C++ 微服务即时通讯系统(三):网关设计——HTTP 请求、Session 鉴权与 WebSocket 通知上一篇
c++·http·微服务
C++ 老炮儿的技术栈1 小时前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
zaizai10071 小时前
STL深度剖析2
java·c++·算法
幻智星科技1 小时前
FPGA纯硬件UDP桥接:微秒级响应新范式
c++·fpga开发·硬件架构
Solange__1 小时前
城市更新方案怎么用AI生成3D街区预演?从底图、体块到公众网页展示
人工智能·游戏·3d·ai·自然语言处理·1024程序员节·关卡设计
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:位运算实战——二进制权限与最大异或解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂1 小时前
2026蓝桥杯青少组图形化真题:校园飞机大战解析(全国青少年信息素养·电子学会图形化考级)
c++·python·算法·bfs·信息学竞赛
CodeYp20192 小时前
第16讲:set 和 map 的使用
开发语言·c++·set·map
可涵不会debug2 小时前
超级马里奥常驻极空间以后怎么打开?Docker运行游戏页面,手机电脑都能从浏览器进入
游戏·docker·智能手机