关于 unreal-cpp-gameplay
面向编写 Unreal Engine 5.8 游戏玩法 C++ 的开发者,讲解反射宏、Gameplay Framework 类职责和模块依赖。内容覆盖从类声明、属性暴露到编译验证的基础流程。
主要功能
- 01遵循 Unreal 类命名前缀
- 02使用反射宏声明类与成员
- 03向编辑器和 Blueprint 暴露属性与函数
- 04创建组件并配置根组件
- 05设置 Gameplay Framework 默认类
- 06配置 Build.cs 模块依赖
适用场景
- 01创建 Actor、Pawn 或组件类
- 02将 C++ 属性和函数提供给 Blueprint
- 03设置 GameMode 默认 Pawn 和控制器
- 04解决模块依赖导致的链接错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill unreal-cpp-gameplay安装后在 Claude Code 中输入/unreal-cpp-gameplay确认已加载。
附带文件references/components-and-gc.md
详细介绍
Unreal C++ 游戏玩法
编写正确的 UE5 游戏玩法 C++:将 C++ 连接到编辑器和蓝图的反射宏、Gameplay Framework 类的职责,以及模块依赖项。目标版本为 UE 5.8。
适用场景
- 创建 C++ 游戏玩法类(
AActor、APawn、ACharacter、AGameModeBase、UActorComponent)、使用UPROPERTY/UFUNCTION暴露属性/函数、设置 GameMode 的默认类,或在*.Build.cs中添加模块依赖项时使用。 - 项目包含使用
UCLASS的Source/目录树,其中有*.h/*.cpp文件和*.Build.cs文件时使用。
不适用场景: 面向设计师的可视化逻辑 → unreal-blueprints。玩家输入绑定细节 → unreal-enhanced-input。AI 逻辑 → unreal-behavior-trees。本技能负责这些功能赖以构建的 C++ 类/反射基础。
核心工作流
- 使用正确的前缀命名。
A= 派生自 Actor,U= 派生自UObject/组件,F= 普通结构体,E= 枚举,I= 接口。前缀必须与基类匹配。 - 使用反射宏声明类。 在类上方添加
UCLASS(),在类体第一行添加GENERATED_BODY(),并将#include "ClassName.generated.h"作为头文件中的最后一条 include。 - 使用
UPROPERTY暴露数据(编辑器/蓝图可见性以及垃圾回收追踪),并使用UFUNCTION暴露行为(BlueprintCallable等)。 - 在构造函数中创建组件,使用
CreateDefaultSubobject<T>(TEXT("Name")),并设置RootComponent。 - 了解框架职责:
AGameModeBase设置规则和默认类;APawn/ACharacter是可控制的身体;APlayerController是玩家的意志;UActorComponent是可复用的行为。 - 在
*.Build.cs中添加模块依赖项(例如EnhancedInput),否则会出现未解析符号的链接错误。 - 验证:编译(函数体可使用 Live Coding
Ctrl+Alt+F11;修改头文件/UPROPERTY后需要完整重建),并检查类/属性是否出现在编辑器中。
模式
1. 最简 Actor 类(头文件 + 源文件)
// Pickup.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Pickup.generated.h" // MUST be the last include
UCLASS()
class MYGAME_API APickup : public AActor // MYGAME_API = your module's export macro
{
GENERATED_BODY()
public:
APickup();
// EditAnywhere = tweak per-instance & on the CDO; BlueprintReadWrite = BP get/set.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pickup")
int32 ScoreValue = 10;
// UPROPERTY on a UObject* pointer is what keeps it from being garbage-collected.
UPROPERTY(VisibleAnywhere)
TObjectPtr<UStaticMeshComponent> Mesh; // UE5: TObjectPtr instead of raw UStaticMeshComponent*
UFUNCTION(BlueprintCallable, Category = "Pickup")
void Collect();
protected:
virtual void BeginPlay() override;
};
// Pickup.cpp
#include "Pickup.h"
#include "Components/StaticMeshComponent.h"
APickup::APickup()
{
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
RootComponent = Mesh; // the mesh is this actor's root
}
void APickup::BeginPlay() { Super::BeginPlay(); } // always call Super
void APickup::Collect() { Destroy(); }
2. 设置默认类的 GameMode
// MyGameMode.cpp — set in the constructor so the engine spawns your classes.
AMyGameMode::AMyGameMode()
{
DefaultPawnClass = AMyCharacter::StaticClass();
PlayerControllerClass = AMyPlayerController::StaticClass();
}
3. Build.cs 中的模块依赖项
// MyGame.Build.cs
PublicDependencyModuleNames.AddRange(new string[]
{
"Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput"
});
常见问题
generated.h不是最后一条 include 或缺失 — 会出现“Cannot find generated header”或“Expected an include”等编译错误。它必须是头文件中的最后一条 include。- 忘记添加
GENERATED_BODY()— 会导致 UHT(Unreal Header Tool)错误;它必须是类体中的第一项。 - 没有
UPROPERTY的原始UObject*— 垃圾回收器无法发现它,可能会在你使用时将其销毁。使用UPROPERTY追踪每个 UObject 指针(在 UE5 中使用TObjectPtr)。 - 使用 Live Coding 修改头文件/
UPROPERTY— Live Coding 可处理函数体,但修改UCLASS/UPROPERTY/头文件后需要完整重启编辑器并重新构建。 - 类前缀错误 — 将 Actor 命名为
UFoo(或将组件命名为AFoo)会导致 UHT 出错;前缀必须与基类类型匹配。 - 链接时出现未解析的外部符号 — 提供该 API 的模块未添加到
Build.cs的PublicDependencyModuleNames中。 - 重写
BeginPlay/Tick等函数时未调用Super::— 会跳过引擎设置。
参考资料
- 关于
UActorComponent的创建/附加、UPROPERTY垃圾回收所有权规则(TObjectPtr、TArray<TObjectPtr<>>、AddToRoot)以及复制入门,请阅读references/components-and-gc.md。 - 主要文档:“Unreal Engine CPP Quick Start”和“Gameplay Framework”
(
https://dev.epicgames.com/documentation/en-us/unreal-engine/gameplay-framework-in-unreal-engine)。
相关技能
unreal-blueprints— 将 C++ 暴露给设计师;BP/C++ 互操作。unreal-enhanced-input— 在 C++ Pawn/Character 中绑定输入。unreal-behavior-trees— 由行为树驱动的 C++ AI 任务。
评论
支持 Markdown