本文主要围绕 UE5 新的输入系统,手把手从 0 搭建 Unreal 项目,实现角色的基础移动。
重要提示:众所周知,C++ 属于编译型语言,因此动态灵活性不足,不过执行效率高,而蓝图简单灵活,却执行效率低。因此推荐一种开发方式—— 用 C++ 创建基类,蓝图继承 C++ 的基类 ,获得一种折衷的优势。
- 开发工具:Visual Studio 2022
- Unreal 版本:5.2.1
创建项目
- 新建一个基于 C++ 的空项目。
- File -> New Level(或者
Ctrl + N
),建立一个 Basic 关卡,保存到新建的 Levels 文件夹中; - Edit -> Project Settings… -> Project -> Maps & Modes 里将
Editor Startup Map
和Game Default Map
设置为新建的关卡。
角色资产
这里选用的 Epic 商城里的免费资产,Paragon: Lt. Belica。目前用的版本是(写的时候的最新的版本) 5.2.1,目前 Belica 还不支持这个版本,选一个最近的版本 5.1 添加到项目中。
创建一个 Character 类
正如开头所说,我们希望获得一种相对优势,因此会用 C++ 作为父类,项目中实际使用的时候用创建蓝图类继承自 C++。对于简单的参数和功能就可以在蓝图上定制,对于通用或核心的功能或方法则可以在上级 C++ 类中实现。
在 Content Browser
的 C++ 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)。调整弹簧臂就可以调节相机的远近。可以说这是所有角色型游戏的基础。
因此,相机是依附于弹簧臂的。 弹簧臂动,相机就动。
我们需要两个组件,USpringArmComponent
和 UCameraComponent
。前缀 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 广告费)
文章来源:https://www.toymoban.com/news/detail-723857.html
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
在构造函数中初始化这两个组件,并指明层级关系。文章来源地址https://www.toymoban.com/news/detail-723857.html
ABelicaCharacter::ABelicaCharacter()
{
PrimaryActorTick.bCanEverTick = true;
CameraBoom =
到了这里,关于UE5 与 C++ 入门教程·第一课:角色与 Enhanced Input的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!