第 3 天:Actor 是什么?创建你的第一个游戏对象!

目标:

了解 Unreal Engine 5 中的 Actor,创建并操控你的第一个 C++ 游戏对象!

1️⃣ 什么是 Actor?

在 Unreal Engine 5 中,Actor 是 游戏世界(World)中的基本对象,几乎所有的游戏元素(玩家、敌人、道具、灯光、摄像机等)都是 Actor 的子类。

Actor 的主要特点

  • 可放入关卡(Level)中
  • 可以拥有组件(Components)(如网格、灯光、声音等)
  • 支持脚本控制(C++ / 蓝图)
  • 生命周期受游戏世界管理(Spawn / Destroy)

在 UE5 C++ 中,Actor 继承自 AActor,并可以使用 UCLASS() 宏进行扩展。

2️⃣ 创建你的第一个 C++ Actor

新建 Actor 类

  1. 打开 UE5,进入你的 C++ 项目。
  2. 在顶部菜单,点击 “文件” → “新建 C++ 类”。
  3. 选择 Actor 作为父类,点击 下一步。
  4. 命名为 MyFirstGameActor,点击 创建并添加到项目。
  5. 等待 UE5 自动生成 C++ 代码并打开 Visual Studio。

3️⃣ 编写 C++ 代码

打开 MyFirstGameActor.cpp 和 MyFirstGameActor.h,让 Actor 在 BeginPlay() 时输出一条日志。

MyFirstGameActor.h(头文件)

#pragma once

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

UCLASS()
class MYFIRSTCPPGAME_API AMyFirstGameActor : public AActor
{
    GENERATED_BODY()

public:	
    AMyFirstGameActor();

protected:
    virtual void BeginPlay() override;
};

MyFirstGameActor.cpp(实现文件)

#include "MyFirstGameActor.h"
#include "Engine/Engine.h"

AMyFirstGameActor::AMyFirstGameActor()
{
    PrimaryActorTick.bCanEverTick = true;
}

void AMyFirstGameActor::BeginPlay()
{
    Super::BeginPlay();
    
    UE_LOG(LogTemp, Warning, TEXT("Hello, this is my first Actor in Unreal Engine 5!"));
}

4️⃣ 编译 & 在场景中使用

编译 C++ 代码

  1. 在 Visual Studio 中,点击 编译(Build) 或按 Ctrl + Shift + B。
  2. 返回 UE5,点击 编译按钮。
    在关卡中添加 Actor
  3. 回到 UE5 编辑器,打开 “世界大纲(World Outliner)”。
  4. 在 内容浏览器(Content Browser) 中找到 MyFirstGameActor。
  5. 拖拽 MyFirstGameActor 进入场景。
  6. 点击 “播放(Play)”,然后打开 输出日志(Output Log),你应该会看到:
LogTemp: Warning: Hello, this is my first Actor in Unreal Engine 5!

✅ 你的第一个 C++ Actor 已成功运行!

5️⃣ Actor 生命周期解析

Actor 在游戏中有 4 个主要生命周期阶段:

阶段 描述
构造函数(Constructor) Actor 生成时调用(用于初始化变量)
BeginPlay() 关卡开始运行时调用(适合初始化逻辑)
Tick() 每一帧都会调用(适用于更新逻辑)
Destroy() Actor 被销毁时调用(可执行清理工作)

Tick() 示例
我们可以在 Tick() 函数中让 Actor 旋转:

void AMyFirstGameActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // 让 Actor 旋转
    FRotator NewRotation = GetActorRotation();
    NewRotation.Yaw += DeltaTime * 50.0f;  // 每秒旋转 50 度
    SetActorRotation(NewRotation);
}

这样 Actor 就会不断旋转,让游戏更生动!

6️⃣ Actor 的组件(Component)

Actor 本身是 空的,但我们可以为它 添加组件(Component),如:

  • StaticMeshComponent(网格,模型)
  • PointLightComponent(灯光)
  • AudioComponent(声音)

添加一个 3D 模型(Static Mesh)

我们可以在 MyFirstGameActor 中添加一个 立方体网格(Cube Mesh):

修改 MyFirstGameActor.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/StaticMeshComponent.h"
#include "MyFirstGameActor.generated.h"

UCLASS()
class MYFIRSTCPPGAME_API AMyFirstGameActor : public AActor
{
    GENERATED_BODY()

public:
    AMyFirstGameActor();

protected:
    virtual void BeginPlay() override;

private:
    UPROPERTY(VisibleAnywhere)
    UStaticMeshComponent* MeshComponent;
};

修改 MyFirstGameActor.cpp

#include "MyFirstGameActor.h"
#include "Components/StaticMeshComponent.h"
#include "UObject/ConstructorHelpers.h"

AMyFirstGameActor::AMyFirstGameActor()
{
    PrimaryActorTick.bCanEverTick = true;

    // 创建 StaticMeshComponent 并设置为根组件
    MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
    RootComponent = MeshComponent;

    // 加载默认立方体模型
    static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Engine/BasicShapes/Cube.Cube"));
    if (MeshAsset.Succeeded())
    {
        MeshComponent->SetStaticMesh(MeshAsset.Object);
    }
}

编译 & 运行

  1. 编译代码(Ctrl + Shift + B),回到 UE5 点击编译。
  2. 将 MyFirstGameActor 拖入场景,你会看到 一个立方体出现在世界中!

✅ 现在你的 Actor 终于有了外观!

7️⃣ 常见问题 & 解决方案

问题 解决方案
Actor 不能拖入场景 确保已 编译代码,并且 C++ 类 继承自 AActor
UE_LOG 没有输出 确保 开启输出日志(Output Log)
立方体网格未显示 检查路径 /Engine/BasicShapes/Cube.Cube 是否正确

总结:今天你学到了什么?

✅ 理解 Actor 在 UE5 中的作用
✅ 创建 & 使用你的第一个 C++ Actor
✅ 实现 Actor 的生命周期方法(BeginPlay / Tick)
✅ 为 Actor 添加组件(Static Mesh)

恭喜你完成 UE5 C++ Actor 学习! 明天我们将深入 组件(Component)系统,让 Actor 更加强大!

记得收藏专栏,每天进步一点,最终独立开发属于你的 UE5 游戏!

你可能感兴趣的:(UE5,C++,进阶之路:从零到独立开发,3A,级游戏!,游戏,ue5,学习,虚幻,unreal,engine,虚幻引擎)