UE4创建一个默认的c++类详解

01 创建一个Actor子类,默认生成代码如下:

//FirstActor.h

#pragma once

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

UCLASS()
class QUICKSTART_API AFirstActor : public AActor
{
    GENERATED_BODY()

public: 
    // 设置此Actor属性的默认值
    AFirstActor();

protected:
    // 游戏开始时或生成时调用
    virtual void BeginPlay() override;

public: 
    // 逐帧调用
    virtual void Tick(float DeltaTime) override;

};
//FirstActor.cpp

#include "FirstActor.h"

// 设置默认值
AFirstActor::AFirstActor()
{
    // 将此Actor设为逐帧调用Tick()。如无需此功能,可关闭以提高性能。
    PrimaryActorTick.bCanEverTick = true;
}

// 游戏开始时或生成时调用
void AFirstActor::BeginPlay()
{
    Super::BeginPlay();

}

// 逐帧调用
void AFirstActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}

02 首先看.h文件

头文件的作用
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FirstActor.generated.h"
  • #include "CoreMinimal"的作用
    CoreMinimal包含一些经常使用的类的定义(包括TArray、FString、FName等),该头文件位于UE4根目录\Engine\Source\RunTime\Core\Public\CoreMinimal.h下。

  • #include "GameFramework/Actor.h"的作用
    因为是创建一个Actor子类,所以需要包含我们继承的类的头文件。

  • #include "XXX.generated.h"的作用
    所有Actor类都需要包含其生成的.h文件,UE4将生成所有反射数据,并放入该文件中必须将该文件放在所有头文件的最下面。

宏UCLASS和GENERATE_BODY

在.h中声明你的类,如果你的类继承自UObject,你的类名上方需要加入UCLASS()宏。同时,你需要在类体的第一行添加GENERATED_BODY()宏,该宏需要手动实现一个无参构造函数。
UCLASS允许我们将类暴露在unreal的反射系统中,反射允许我们在运行时检查和迭代对象属性,以及管理对垃圾回收对象的引用。

举例

UCLASS(BlueprintType, Blueprintable, config=Engine, meta=(ShortTooltip="An Actor is an object that can be placed or spawned in the world."))
class ENGINE_API AActor : public UObject
{
	GENERATED_BODY()
	//......
}

类型说明符就是UCLASS()括号中可选的说明符,比如:

类说明符作用说明
Abstract注明这个类是抽象类,可以阻止用户通过“拖拽”的方式向场景里添加这个类的Actor
Blueprintable可以被蓝图类继承,该说明符会传递给派生类AActor已声明
NotBlueprintable不可被蓝图类继承,该说明符会传递给派生类
BlueprintType可用于蓝图的变量类型AActor已声明
Config=ConfigName指定默认的配置文件

具体可参考:官方文档

class ENGINE_API AActor : public UObject {  }

如果Actor 希望将 AActor 类公开到其他模块,则需要指定 ENGINE_API,这对游戏项目将包括的模块或插件十分实用。

声明函数BeginPlay()和Tick(float DeltaTime)

BeginPlay()和Tick(float DeltaTime)是在子类中重写父类的虚函数,调用子类之前要先调用父类的函数(具体看.cpp中)

BeginPlay()是在游戏一开始的时候调用
Tick(float DeltaTime)是逐帧调用

03 .cpp文件

构造函数
// 可以在构造函数中设置默认值
AFirstActor::AFirstActor()
{
    // 将此Actor设为逐帧调用Tick()。如无需此功能,可关闭以提高性能。
    PrimaryActorTick.bCanEverTick = true;
}
实现函数BeginPlay()和Tick(float DeltaTime)
// 游戏开始时或生成时调用
void AFirstActor::BeginPlay()
{
    Super::BeginPlay();

}

// 逐帧调用
void AFirstActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}

Super的作用:
调用父类有参数的构造方法,必须放在子类的构造方法中,并且只能放在构造方法的首句;括号中的参数是指与父类此有参构造方法中参数苏剧类型相对应的的子类中的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值