前言
- 由于本人的另一个教程有关UE5的教程系列基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)—UnrealCV获取深度+分割图像-CSDN博客即将更新至使用cpp书写UE5自定义插件,故本系列教程将叫你快速入门UE5-c++
- 本系列教程默认读者有C++使用基础,故不对一些C++基础知识进行详细讲解
- 本系列教程使用的是最新的UE5.4.3和VS2022作为使用实例
UE5介绍
UE5(Unreal Engine5)
是由Epic Games开发的一款功能强大、跨平台的最新版的游戏开发引擎,以其高质量的实时渲染效果、多编程语言支持、丰富的市场资源和活跃的社区而闻名,广泛应用于游戏、影视、建筑等多个领域,不断推动着数字内容产业的发展。- 目前
Unreal Engine(UE)
主要支持以下编程语言:-
- C++:
- C++是UE的核心编程语言,用于编写引擎的底层架构和游戏逻辑。
- 它提供了最高的性能和灵活性,允许开发者直接访问和修改引擎的各个组件。
- C++在UE中通过自定义的反射系统与蓝图系统紧密集成,使得C++类和函数可以在蓝图可视化编程环境中被使用。
- 蓝图(Blueprint):
- 蓝图是UE的一种可视化脚本系统,它允许开发者通过拖拽连接节点的方式来创建逻辑和功能,无需编写传统的代码。
- 蓝图降低了编程的入门门槛,使得非程序员也能参与到游戏和应用的开发中。
- 蓝图可以与C++代码无缝交互,使得开发者可以根据需要选择最适合的编程方法。
-
安装UE5
本系列教程将使用最新版的
UE5.4.3
作为教程使用在下载
UE
需要先安装Epic Games Launcher,下载链接下载完后初次进入会要求注册
Epic
账号,注册好后选择虚幻引擎的库选项,选择“+”号在下拉的菜单栏中选择5.4.3
即可完成下载注意下载可能需要根据个人需求安装对应的编辑器,这里我们使用的是
VisualStudio2022
完成安装后我们选择创建一个全新的C++空白模板项目
创建完项目打开我们会得到以下的画面,这样就完成
UE5.4版本的安装
开始本UE5教程需要做好的准备
- 拥有C++基础尝试
- 下载好UE5(本教程以UE5.4.3作为示范)
- 安装好自己的C++编辑器,这里推荐使用VisualStudio作为编辑器(本教程以VS2022作为示范)
1. 新建一个项目
- 通过
EpicGameLauncher
启动UE5
,在新弹出的窗口创建新的项目,选择C++
,然后创建你的项目 - 打开新的项目后你会得到以下画面
1-1 物体移动缩放
- 关于键盘wsad,鼠标中间,三色箭头移动物体可以自己尝试
- 按下
shift
移动物体,视角将跟着物体一起移动 - 我们也可以设置一些移动或者选择,拉伸,缩放物体的角度数和格子数,同时我们也可以设置摄像机移动速度
1-2 开始运行
在指示栏左上角,你会看到一个
绿色箭头
,按下绿色箭头开始进行仿真处于运行状态下可以使用esc退出或者按下红色终止按钮
shift+F1
将唤醒鼠标
1-3 VS
正常情况下打开UE5新项目会跟着打开VS编辑器,你会得到以下画面
如果并没有打开可以在工具栏里头手动打开
1-4 项目基础框架
下面是新建项目的所有文件夹
.vs
: 这个目录包含与 Visual Studio 相关的文件,如项目设置、构建日志等。Binaries
: 这个目录包含编译后的二进制文件,即你的游戏的可执行文件和相关的库文件。Config
: 这个目录包含项目的配置文件,如DefaultEngine.ini
和Game.ini
。这些文件包含了引擎和游戏的设置,如分辨率、控制方案、音量等。Content
: 这个目录包含项目的所有内容资产,如模型、纹理、动画、音效、蓝图等。这些资产是游戏内容的核心部分。DerivedDataCache
: 这个目录包含由引擎生成的数据,如光照贴图、LOD数据、动画数据等。这些数据是基于内容目录中的资产生成的。Intermediate
: 这个目录包含编译过程中的中间文件,如编译器输出、临时文件等。这些文件在构建过程中生成,并在构建完成后通常不再需要。Saved
: 这个目录包含游戏的保存游戏数据、关卡数据、配置文件等。这些文件在游戏运行时生成,并且在游戏发布时通常会被包含在内。Source
: 这个目录包含项目的源代码,如 C++ 文件、头文件、模块定义文件等。这是开发者编写和修改代码的地方。.vsconfig
: 这个文件可能是一个配置文件,用于 Visual Studio。它可能包含开发者特定的设置,如编译器选项、调试设置等UE5Tutorial.sln
: 这是一个 Visual Studio 解决方案文件,它定义了 Visual Studio 如何构建和管理项目中的源代码文件。当你使用 Visual Studio 打开这个文件时,它会加载项目的所有源代码文件,并允许你进行编译、调试和部署。UE5Tutorial.uproject
: 这是 Unreal Engine 项目的配置文件,它包含了项目的设置、构建配置和项目依赖等信息
点开
Source
会得到以下内容UE5Tutorial
: 这个子目录代表项目中的一个模块,名称与项目名称相同。UE5Tutorial.Target.cs
: 这个文件是一个 C# 脚本,用于定义如何编译UE5Tutorial
模块。它包含了编译目标、模块依赖关系和编译器设置等信息。Target.cs
文件是 Unreal Engine 的构建系统的一部分,用于指导 Unreal Build Tool (UBT) 如何构建模块。UE5TutorialEditor.Target.cs
: 这个文件也是一个 C# 脚本,但它专门用于定义如何编译UE5Tutorial
模块的编辑器版本。
1-5 构建指南
这里来介绍构建项目的一些基础配置,选择Development Editor,
点击左上角开始执行绿色透明箭头,此操作会编译所有代码并启动一个全新的UE5窗口
或者我们可以在UE5左下角找到build按钮,他同样可以进行构建整个项目
2. 创建一个Actor小球
2-1 概念简介
Actor
是一个核心的概念,它是游戏世界中的基本对象。Actor
类是所有游戏对象的基类,它定义了游戏世界中的实体,如角色、道具、场景元素等。Actor
类提供了许多基本的功能,如位置、旋转、缩放、碰撞检测、物理模拟、事件响应等。我们在右下角项目内容中创建一个蓝图类,选择父类为
Actor
并命名为Ball=创建后我们会出现以下画面
然后我们在左上角
+ 添加
选择添加一个新的球体保存并放在一边
3 创建一个自定义移动组件Components
Components
是Actor
的构建块,它们是Actor
的子对象,提供了Actor
的功能和特性。每个Actor
可以包含多个Components
,这些Components
可以是可视的(如网格、粒子系统、骨骼网格等)或非可视的(如音效、碰撞、物理等)。Components
允许开发者以模块化的方式构建Actor
,使得游戏对象可以灵活地组合和重用。在上方
工具
中新建一个C++类这里我们以SceneComponent作为实例
创建新类,取名为
MoveComponent
UE5会设置一个LiverCoding来管理你新添加的组件
回到VS2022会检测到你的代码发生变化,因为我们创建了一个新的类,这里我们选择全部重新加载
我们注意到新注册的类以及被添加到工程中,接下来我们来看看这几个文件
MoveComponet.hpp
#include "Components/SceneComponent.h"
基类#include "MoveComponent.generated.h"
注意这个头文件一定要是最后包含的,这是因为.generated.h
文件可能包含一些宏,这些宏会在预处理时执行,如果它们在包含其他头文件之后执行,可能会导致问题,例如重复定义、不正确的类型解析等。UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
:UCLASS
宏用于定义一个类,它是UObject
的子类,这意味着它可以被序列化、反射和脚本化。UCLASS
宏用于标记一个类为 Unreal Engine 中的可序列化对象,这使得它可以被 Unreal Engine 的反射系统识别,并可以被蓝图系统使用。ClassGroup=(Custom)
: 这个参数用于将类分组到自定义的类别中。meta=(BlueprintSpawnableComponent)
: 这个参数是一个元数据标签,它指定了类是一个可以由蓝图实例化的组件。
GENERATED_BODY()
宏用于指示编译器在类定义的末尾包含由 Unreal Engine 的代码生成工具自动生成的代码。定义了Super
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/SceneComponent.h"
#include "MoveComponent.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class UE5TUTORIAL_API UMoveComponent : public USceneComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UMoveComponent();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};
- MoveComponet.cpp
PrimaryComponentTick
是一个成员变量,属于UActorComponent
类。它是一个ETickableGameObject
枚举,用于控制组件的Tick
函数的调用行为。ETickableGameObject
枚举有三个值:ETickableGameObject::NotTickable
: 组件不会调用Tick
函数。ETickableGameObject::Tickable
: 组件将在游戏框架的Tick
调用期间调用Tick
函数。ETickableGameObject::AlwaysTick
: 组件即使在编辑器中也会调用Tick
函数。
BeginPlay
是一个在Actor
或ActorComponent
的生命周期中被调用的函数。当Actor
或Component
被添加到世界(例如,当关卡被加载或Actor
被创建)时,BeginPlay
函数会被调用一次。这个函数通常用于初始化代码,比如设置初始状态、开始协程或异步操作等。TickComponent
是一个在ActorComponent
的生命周期中被调用的函数。当Component
被标记为可Tick
时(例如,通过设置PrimaryComponentTick.bCanEverTick = true;
),它的Tick
函数将在每一帧中被调用。DeltaTime
是自上一帧以来经过的时间(以秒为单位)。
TickType
指定了Tick
调用的类型,例如LEVELTICK_Allowed
、LEVELTICK_ViewportsOnly
、LEVELTICK_Pause
等。ThisTickFunction
是一个指向当前Tick
函数的指针,它可以用来控制Tick
的行为,例如设置Tick
间隔或禁用Tick
。
// Fill out your copyright notice in the Description page of Project Settings.
#include "MoveComponent.h"
// Sets default values for this component's properties
UMoveComponent::UMoveComponent()
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
PrimaryComponentTick.bCanEverTick = true;
// ...
}
// Called when the game starts
void UMoveComponent::BeginPlay()
{
Super::BeginPlay();
// ...
}
// Called every frame
void UMoveComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// ...
}
4 编写自定义移动组件Components
逻辑
- 本节我们将要创建一个移动小球,通过指定目标位置和移动速度,使小球朝着指定方向进行运动
- 我们在创建的UMoveComponent类中添加如下变量
StartRelativeLocation
相对起始位置speed
速度EndRelativeLocation
相对终止位置CurrentLocation
当前位置stoppingDistance
用于指定靠近程度,距离目标小于1时候不在运动
private:
FVector StartRelativeLocation;
UPROPERTY(EditAnywhere)
float speed=1.0f;
UPROPERTY(EditAnywhere)
FVector EndRelativeLocation;
FVector CurrentLocation;
float stoppingDistance = 1.0f;
- 我们来介绍上述变量创建中的要点:
FVector
FVector
是一个用于表示三维向量的结构体,它通常用于表示空间中的位置、方向、速度、加速度等。
struct FVector
{
float X;
float Y;
float Z;
//...
};
UPROPERTY
宏
UPROPERTY
宏用于在 C++ 类中定义可以被蓝图系统访问的属性。UPROPERTY
宏告诉 Unreal Engine 的反射系统如何序列化属性,以及如何在编辑器中显示和编辑这些属性。UPROPERTY(EditAnywhere)
是UPROPERTY
宏的一个参数,它是一个元数据标签,用于指定属性可以在任何地方编辑,包括在 Unreal Engine 编辑器中的属性窗口和在蓝图中。这意味着属性可以被非 C++ 开发者(如使用蓝图的用户)访问和修改。UPROPERTY
宏可以接受多个参数,用于指定属性的各种属性和行为。除了EditAnywhere
,还有一些其他的常用参数:UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Movement")
Category
: 指定属性在编辑器中的类别。Meta
: 提供额外的元数据,如EditCondition
、ClampMin
、ClampMax
等。BlueprintReadOnly
: 用于在编辑器中显示属性,但在运行时不可见。VisibleAnywhere
: 类似于EditAnywhere
,但主要用于在 C++ 代码中控制属性的可见性。Parm
: 用于在函数参数中标记属性,以便它们可以在蓝图中使用。
这里设置
speed
和EndRelativeLocation
为EditAnywhere
说明这两个属性可以在任何地方编辑,包括在 Unreal Engine 编辑器中的属性窗口和在蓝图中。然后我们在cpp文件中实现具体逻辑,实现很简单,这里我们就不进行说明
// Fill out your copyright notice in the Description page of Project Settings.
#include "MoveComponent.h"
// Sets default values for this component's properties
UMoveComponent::UMoveComponent()
{
PrimaryComponentTick.bCanEverTick = true;
CurrentLocation = StartRelativeLocation;
}
// Called when the game starts
void UMoveComponent::BeginPlay()
{
Super::BeginPlay();
StartRelativeLocation = FVector(0.0f, 0.0f, 0.0f);
}
// Called every frame
void UMoveComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (FVector::Dist(CurrentLocation, EndRelativeLocation) < stoppingDistance)
{
return;
}
FVector Direction = (EndRelativeLocation - CurrentLocation).GetSafeNormal();
FVector NewLocation = CurrentLocation + (Direction * (speed * DeltaTime));
SetRelativeLocation(NewLocation);
CurrentLocation = NewLocation;
}
- 完成上述代码后进行build
5 在Actor上套用自定义移动组件Components
打开刚刚创建的蓝图类,在左上角添加找到我们刚刚写的Move组件
将Move组件上移,使其作为新的根
保存后回到主界面,上托可以看到球被添加到主场景中
我们在右侧属性中设置目标速度和目标位置
点击开始仿真,小球朝着目标位置前进
最终小球停在了目标点前方1处
小结
- 本节最主要介绍了UE5的下载,基础功能,文件架构,创建新的工程,以及创建Actor和Component,以及使用最基础的cpp书写了一个简单的小球追逐代码
- 感谢大家对本教程的支持,如有错误,欢迎指出