Unreal Engine 4 C++ UCLASS构造函数易出错分析

本文详细解析了Unreal Engine 4 (UE4) 中C++ UCLASS构造函数的使用方法及常见错误。重点区分了GENERATED_BODY()与GENERATED_UCLASS_BODY()宏的使用场景,帮助开发者正确实现类的构造函数。

Unreal Engine 4 C++ UCLASS构造函数易出错分析

好记性不如烂笔头啊,还是记录一下!


在Unreal Engine 4的任意类中通常会见到两个宏:

  • GENERATED_BODY()
  • GENERATED_UCLASS_BODY()

在一篇教程中有时候会有这样的说法:

11

这个说法并不严谨,并没有完全解释UCLASS_BODY()和BODY()区别。

具体分析:

首先为什么有两个宏定义的区别,主要是考虑到,继承父类之后,在于是否需要对父类的东西有所改动,构造函数的初始化亦是如此。

下面来说明下两种方法的不同:


1.GENERATED_BODY()

如果定义的是GENERATED_BODY(),那么意味着我不需要使用父类的构造函数,也就是说,我不能直接使用父类的声明,但是,我需要去实现的时候,我就必须自己去声明,否则就会报错。

  • MyCharacter.h
UCLASS()
class MYCHARACTER_API AMyCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    AMyCharacter(const FObjectInitializer& ObjectInitializer);

};

然后就可以在CPP中实现自己声明的这个构造函数,编译通过。

  • MyCharacter.cpp
AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{

}

如果不去声明自己的构造函数,就会报错:

MyCharacter.cpp(7): error C2084: 函数“AMyCharacter::AMyCharacter(const FObjectInitializer &)”已有主体
MyCharacter.h(14): note: 参见“{ctor}”的前一个定义


1.GENERATED_UCLASS_BODY()

如果定义的是GENERATED_UCLASS_BODY(),那么意味着我使用父类的构造函数,也就是说,我不需要为自己声明构造函数,直接去实现父类声明那个构造函数。

  • MyCharacter.h
UCLASS()
class MYCHARACTER_API AMyCharacter : public ACharacter
{
    GENERATED_UCLASS_BODY()
};

那么在CPP文件中去实现,而不需要在H里面去声明,编译通过!

  • MyCharacter.cpp
AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{

}

如果还去声明自己的构造函数,就会报错:

UCLASS()
class MYCHARACTER_API AMyCharacter : public ACharacter
{
    GENERATED_UCLASS_BODY()

public:
    AMyCharacter(const FObjectInitializer& ObjectInitializer);

};

也就是这个最常见的错误。

error C2535: “AMyCharacter::AMyCharacter(const FObjectInitializer &)”: 已经定义或声明成员函数
note: 参见“AMyCharacter::AMyCharacter”的声明

完结..


本文参考:少狼 – 敬畏知识的顽皮狗 » UE4 C++ UCLASS构造函数易出错分析

<think>我们正在回答用户的问题:在UnrealEngine中创建和添加新C++类的方法。根据引用内容,特别是引用[1]和引用[2]中提到的步骤,我们可以总结出以下步骤:1.在UnrealEditor中创建C++类2.编写C++代码3.编译项目4.在编辑器中测试和使用注意:引用[1]提到“类的创建、理解和使用继承”,引用[2]提到“创建C++类开始,编写代码以实现这些功能”,引用[4]展示了一个Actor类的代码示例。因此,我们将按照以下步骤详细说明:步骤1:通过编辑器创建C++类步骤2:编写C++类的基本结构(头文件和源文件)步骤3:在编辑器中测试新类同时,我们将生成相关问题。</think>### 在Unreal Engine中创建和添加新C++类的方法 在Unreal Engine中创建C++类是开发的核心操作,以下是详细步骤(基于UE 5.3): #### 方法1:通过编辑器界面创建 1. **打开类创建向导** - 在Unreal Editor中,点击顶部菜单 **文件(File) > 新建C++类(New C++ Class)** - 或使用快捷键 **Ctrl+N** 2. **选择父类** - 在弹出窗口中,选择要继承的基类(如`Actor`、`Character`、`Pawn`等) - 常用选项: - `Actor`:基础游戏对象[^4] - `Character`:带移动组件的角色 - `UserWidget`:UI控件 - `Object`:纯逻辑类 3. **命名与配置** - 输入类名(遵循PascalCase命名规范,如`MyCustomActor`) - 选择存储路径(默认为`Source/ProjectName/`) - 点击 **创建类(Create Class)** 按钮 4. **自动生成文件** - 系统将自动创建: - 头文件:`MyCustomActor.h` - 源文件:`MyCustomActor.cpp` - 触发项目编译(首次创建需等待1-5分钟) #### 方法2:手动创建文件 1. **创建文件** - 在项目目录的`Source/ProjectName/`下新建: - 头文件:`Public/MyCustomActor.h` - 源文件:`Private/MyCustomActor.cpp` 2. **编写基础结构** ```cpp // MyCustomActor.h #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyCustomActor.generated.h" // 必须包含 UCLASS() // UCLASS宏声明 class YOURPROJECT_API AMyCustomActor : public AActor { GENERATED_BODY() // 必须包含 public: AMyCustomActor(); // 构造函数 }; ``` ```cpp // MyCustomActor.cpp #include "MyCustomActor.h" AMyCustomActor::AMyCustomActor() { PrimaryActorTick.bCanEverTick = true; // 启用Tick } ``` 3. **注册到项目** - 在`YOURPROJECT.Build.cs`中添加模块引用: ```cpp PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" }); ``` #### 关键注意事项 1. **宏指令要求** - 所有UClass必须使用`UCLASS()`宏 - 类声明内必须有`GENERATED_BODY()` - 派生类前缀(如`A`表示Actor,`U`表示Object) 2. **热重载机制** - 修改代码后: - 使用 **编译(Compile)** 按钮(工具栏) - 或快捷键 **Ctrl+Alt+F11** - 避免运行时修改:可能导致热重载失败 3. **与蓝图交互** - 暴露变量给蓝图: ```cpp UPROPERTY(EditAnywhere, BlueprintReadWrite) float Health = 100.0f; ``` - 暴露函数给蓝图: ```cpp UFUNCTION(BlueprintCallable) void CustomFunction(); ``` #### 验证与调试 1. **在编辑器中使用** - 创建蓝图派生类: - 右键点击内容浏览器 - 选择 **蓝图类(Blueprint Class)** - 搜索你的C++类作为父类 - 直接拖入场景(如Actor派生类) 2. **日志输出调试** ```cpp UE_LOG(LogTemp, Warning, TEXT("Health: %f"), Health); ``` 3. **常见错误处理** - 编译失败:检查`GENERATED_BODY()`位置 - 链接错误:确认`.Build.cs`模块依赖 - 编辑器崩溃:检查虚函数重写错误 > 通过C++创建核心功能,再通过蓝图扩展行为,是Unreal推荐的混合开发模式[^5]。例如引用[2]中的角色移动功能,可先用C++实现基础逻辑,再用蓝图添加视觉特效[^2]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值