[toc]

从 C++ 入手

计划学习路径参考 UE 官方文档: https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/CPPProgrammingQuickStart/

# 新建一个 Actor

# 什么是 Actor

类似于 Unity 中的 GameObject, 即万物基类 (暂时这么理解,后面有变动再改)

# 创建一个 C++ Actor

在 UE5 中,面板有变动.UE4 中需要通过文件创建一个新的 C 类,但是 UE5 中的路径变更为了:工具 -> 新建 C 之后选择 C++ 的基类为 Actor
然后创建出来自己想要的类 (这里命名为 FloatingActor)

# 编辑 FloatingActor

这个文件的路径是在 Games/[你的项目名称]/Source/[你的项目名称]/FloatingActor.cpp/h 和 C++ 同理,.h 中通常存放一些暴露相关的接口和对象 这里我们在 AFloatingActor (); 下面声明一个可视化的 Mesh 和可显示在任意地方的宏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatingActor.generated.h"

UCLASS()
class DEMO_API AFloatingActor : public AActor
{
GENERATED_BODY()

public:
// Sets default values for this actor's properties
AFloatingActor();
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* VisualMesh;

protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;

public:
// Called every frame
virtual void Tick(float DeltaTime) override;

};

# 构造函数

在 FloatingActor.cpp 中有一个初始化函数, AFloatingActor() 这个函数可以作为构造函数来使用 我们在其中为 VisualMesh 赋值一个新的 Mesh 对象.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//这个函数是构造函数
// Sets default values
AFloatingActor::AFloatingActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;

VisualMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
VisualMesh->SetupAttachment(RootComponent);

static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube"));

if (CubeVisualAsset.Succeeded()) {
VisualMesh->SetStaticMesh(CubeVisualAsset.Object);
VisualMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
}
}

其中, RootComponnet 是全局根对象,然后创建一个资源读取的 Asset (暂时这么理解), 如果读取成功了,则将 mesh 的信息和位置都初始化一下.

# BeginPlay

类似于 Unity 的 Start

# Tick

每帧执行的函数,类似于 Update 在这个函数里,我们让当前这个对象不断地旋转和浮动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Called every frame
void AFloatingActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FVector NewLocation = GetActorLocation(); //获取当前对象位置
FRotator NewRotation = GetActorRotation(); //获取当前对象旋转

float RunningTime = GetGameTimeSinceCreation(); //获取创建到现在的时间
float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
NewLocation.Z += DeltaHeight * 20.0f; //高度浮动
float DeltaRotation = DeltaTime * 20.0f; //旋转浮动
NewRotation.Yaw += DeltaRotation;

SetActorLocationAndRotation(NewLocation,NewRotation); //设置位置和旋转
}

# 编译 FloatingActor

当我们编写完这个对象后,需要编译一下 Games 下的项目,这样才能让这个对象在编辑器中可以供我们操作

# 查看内容库

类似于 Unity 中的 Project, 即所有资源的库存,包括我们刚才制作的 FloatingActor. 这里可以设置停靠在布局中

# 实例化 FloatingActor

将内容库中的 Actor 拖入到场景中即可

# 结果