UE5 与 C++ 入门教程·第一课:角色与 Enhanced Input

本文是UE5和C++结合的入门教程,讲解如何创建项目、设置角色资产,创建Character类,使用Spring Arm和Camera,以及如何实现Enhanced Input系统,包括Input Action和Input Mapping Context,最终实现角色的键盘和鼠标控制移动。
摘要由CSDN通过智能技术生成

本文主要围绕 UE5 新的输入系统,手把手从 0 搭建 Unreal 项目,实现角色的基础移动。

重要提示:众所周知,C++ 属于编译型语言,因此动态灵活性不足,不过执行效率高,而蓝图简单灵活,却执行效率低。因此推荐一种开发方式—— 用 C++ 创建基类,蓝图继承 C++ 的基类 ,获得一种折衷的优势。

  • 开发工具:Visual Studio 2022
  • Unreal 版本:5.2.1

创建项目

  1. 新建一个基于 C++ 的空项目。
  2. File -> New Level(或者 Ctrl + N),建立一个 Basic 关卡,保存到新建的 Levels 文件夹中;
  3. Edit -> Project Settings… -> Project -> Maps & Modes 里将 Editor Startup MapGame Default Map 设置为新建的关卡。

角色资产

这里选用的 Epic 商城里的免费资产,Paragon: Lt. Belica。目前用的版本是(写的时候的最新的版本) 5.2.1,目前 Belica 还不支持这个版本,选一个最近的版本 5.1 添加到项目中。

Belica 资产

创建一个 Character 类

正如开头所说,我们希望获得一种相对优势,因此会用 C++ 作为父类,项目中实际使用的时候用创建蓝图类继承自 C++。对于简单的参数和功能就可以在蓝图上定制,对于通用或核心的功能或方法则可以在上级 C++ 类中实现。

Content BrowserC++ Classes 点击右键 New C++ Class... 或者在顶部 Tools -> New C++ Class…

这里并没有放到默认目录,而是放到 Character 目录里。注意,这里生成的 C++ 代码会有一个头文件的问题。

// 由于将类创建到 `Character` 目录下,自动生成的代码是下面的这样
#include "Character/BelicaCharacter.h"

// 去掉 Character/,改成下面这样,否则编译会出错
#include "BelicaCharacter.h"

Spring Arm 与 Camera

角色后面跟着一个相机,叫做 跟随相机(followed camera)。为了控制相机与角色的相对距离,通常还带一个弹簧臂(Spring Arm)。调整弹簧臂就可以调节相机的远近。可以说这是所有角色型游戏的基础。

因此,相机是依附于弹簧臂的。 弹簧臂动,相机就动。

我们需要两个组件,USpringArmComponentUCameraComponent。前缀 U 代表继承自 UObject

BelicaCharacter.h 中添加两个组件:

private:
	UPROPERTY(VisibleAnywhere, Category = Camera)
		class USpringArmComponent* CameraBoom;

	UPROPERTY(VisibleAnywhere, Category = Camera)
		class UCameraComponent* FollowCamera;

这里使用了前向声明的小技巧,对于指针类型,可以声明类型,而不需要引入头文件,这样可以避免影响编译速度。这就是为什么使用 class。当然,如果你愿意的话,也可以单独放到文件的开头进行声明,类似下面这样:

class USpringArmComponent;
class UCameraComponent;

UPROPERTY 是 Unreal 定义的宏。某种意义上也是黑魔法,例如你可以让 private 也可以被访问。UPROPERTY 用途非常广,比如变量复制、序列化、蓝图访问、垃圾回收。本文作为入门教程就不展开了。

BelicaCharacter.h 中使用了前向声明,但在 BelicaCharacter.cpp 中,我们就需要关注类的具体方法,因此就必须引入头文件。要查询类在哪个头文件里,最简单粗暴但有效的方法就是把类名贴入搜索引擎。如果你使用的是 Jetbrains 家的 Rider 进行 Unreal 开发,IDE 会自动帮你补全头文件,就可以不用操心这个问题。(特此声明,本人没有收取任何 Jetbrains 广告费)

所在头文件

#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"

在构造函数中初始化这两个组件,并指明层级关系。

ABelicaCharacter::ABelicaCharacter()
{
   
	PrimaryActorTick.bCanEverTick = true;
	
	CameraBoom = 
  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值