UE5-C++入门教程(一):使用代码创建一个指定目标的移动小球

前言


UE5介绍

请添加图片描述

  • UE5(Unreal Engine5)是由Epic Games开发的一款功能强大、跨平台的最新版的游戏开发引擎,以其高质量的实时渲染效果、多编程语言支持、丰富的市场资源和活跃的社区而闻名,广泛应用于游戏、影视、建筑等多个领域,不断推动着数字内容产业的发展。
  • 目前Unreal Engine(UE)主要支持以下编程语言:
      1. C++
      • C++是UE的核心编程语言,用于编写引擎的底层架构和游戏逻辑。
      • 它提供了最高的性能和灵活性,允许开发者直接访问和修改引擎的各个组件。
      • C++在UE中通过自定义的反射系统与蓝图系统紧密集成,使得C++类和函数可以在蓝图可视化编程环境中被使用。
    1. 蓝图(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.iniGame.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

  • ComponentsActor 的构建块,它们是 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 是一个在 ActorActorComponent 的生命周期中被调用的函数。当 ActorComponent 被添加到世界(例如,当关卡被加载或 Actor 被创建)时,BeginPlay 函数会被调用一次。这个函数通常用于初始化代码,比如设置初始状态、开始协程或异步操作等。
    • TickComponent 是一个在 ActorComponent 的生命周期中被调用的函数。当 Component 被标记为可 Tick 时(例如,通过设置 PrimaryComponentTick.bCanEverTick = true;),它的 Tick 函数将在每一帧中被调用。
      • DeltaTime 是自上一帧以来经过的时间(以秒为单位)。
      • TickType 指定了 Tick 调用的类型,例如 LEVELTICK_AllowedLEVELTICK_ViewportsOnlyLEVELTICK_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: 提供额外的元数据,如 EditConditionClampMinClampMax 等。
    • BlueprintReadOnly: 用于在编辑器中显示属性,但在运行时不可见。
    • VisibleAnywhere: 类似于 EditAnywhere,但主要用于在 C++ 代码中控制属性的可见性。
    • Parm: 用于在函数参数中标记属性,以便它们可以在蓝图中使用。
  • 这里设置speedEndRelativeLocationEditAnywhere 说明这两个属性可以在任何地方编辑,包括在 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书写了一个简单的小球追逐代码
  • 感谢大家对本教程的支持,如有错误,欢迎指出
  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值