UE4使用UCLASS宏包裹原生C++ENUM
时间: 2024-09-14 07:04:05 浏览: 64
在Unreal Engine 4 (UE4)中,UCLASS宏通常用于声明C++中的类作为Unreal的UObject系统的一部分。而UObjects是UE4中的一种特殊类,拥有反射(Reflection)和其他高级特性,比如序列化、垃圾回收(Garbage Collection)和编辑器支持等。
对于C++枚举类型(enum),UE4没有直接使用UCLASS宏去包装,因为枚举通常不需要这些高级特性。但是,UE4提供了一种特殊的宏UENUM,用来创建可以被引擎反射系统识别的枚举类型。使用UENUM宏声明的枚举类型,可以享受到和UCLASS相同的一些特性,例如能够在编辑器中被序列化和编辑。
当你使用UENUM宏声明枚举时,你还可以指定枚举在编辑器中的显示方式和其他属性,比如它是否可以被复制粘贴等。
示例代码可能如下:
```cpp
UENUM(BlueprintType)
enum class MyEnum : uint8
{
Value1,
Value2,
Value3
};
```
在这个示例中,`BlueprintType`关键字是可选的,它表示这个枚举可以在蓝图(Blueprints)中使用。如果不添加`BlueprintType`,则这个枚举只能在C++代码中使用,不能在蓝图编辑器中使用。
相关问题
UE重写UCLASS如何调用基类
在Unreal Engine (UE) 中,如果你想要在派生自`UCLASS`的子类中重写基类的功能,通常需要通过`REQUIRES(OVERRIDE)`、`OVERRIDE`等关键字来声明你要重写的虚函数。虚函数是在基类中声明为`virtual`的成员函数,这样子类就可以提供自己的实现。
首先,在基类的声明中,将你想要子类覆盖的方法声明为虚函数:
```cpp
UCLASS()
class YOUR_BASE_CLASS : public UObject
{
public:
// 声明虚函数
virtual void OnBaseFunction() PURE_VIRTUAL; // 或者如果有参数:virtual void YourFunction(AYourParameterType Param);
// 其他基类功能...
};
```
然后,在子类中重写这个方法:
```cpp
UCLASS(ReplacesAny, ClassGroup = "YourClassGroup")
class YOUR_DERIVED_CLASS : public YOUR_BASE_CLASS
{
public:
// 使用OVERRIDE关键字明确表示这是对基类方法的重写
virtual void OnBaseFunction() OVERRIDE override {
// 这里放置子类的具体实现
// ...
}
// 子类特有的功能...
};
```
当在派生类的对象上调用这个方法时,会执行子类提供的实现,而不是基类默认的行为。这允许你在保持代码复用的同时,根据实际情况修改特定的功能。
UE4 C++ 例子
以下是一个简单的UE4 C++代码例子:
```c++
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
public:
// 构造函数
AMyActor();
// 每帧调用
virtual void Tick(float DeltaTime) override;
// Actor启动时调用
virtual void BeginPlay() override;
// 定义一个变量
UPROPERTY(EditAnywhere, Category = "MyActor")
float MyVariable;
};
```
这个例子定义了一个名为`AMyActor`的类,它继承自`AActor`,并包含了一个名为`MyVariable`的浮点数变量。它还覆盖了`BeginPlay`和`Tick`函数,这些函数将在Actor启动时以及每帧调用。此外,它还有一个默认的构造函数。
在`.cpp`文件中,你可以实现这些函数的具体内容。例如:
```c++
#include "MyActor.h"
// 构造函数
AMyActor::AMyActor()
{
// 设置默认值
MyVariable = 0.f;
}
// 每帧调用
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 在这里添加每帧的逻辑代码
}
// Actor启动时调用
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// 在这里添加Actor启动时的逻辑代码
}
```
这些代码将在Actor启动时和每帧调用时执行。你可以在这些函数中添加自己的逻辑代码,以实现想要的行为。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)