虚幻引擎5 C++编程学习

虚幻引擎5 C++编程学习_第1张图片 

一、反射和垃圾回收系统

什么是反射

反射是程序在运行时检查自身,将参与反射的数据(变量,类,函数等等)暴露给蓝图,允许运行时去调用。

为了标记一个头文件包含反射类型,需要添加一个头文件"XXX.generate.h"必须放在头文件的尾部,该文件一般位于“Project\工程名\Intermediate\Build\Win64\ Inc\工程名\类名.generate.h”

#include "XXX.generate.h"

可以使用UENUM()UCLASS()USTRUCT()UFUNCTION()、以及UPROPERTY()来在头文件中注解不同的类型以及成员变量。每一个宏都会出现在类型或者成员变量的前面,并且可以包含额外的修饰符关键字。

UCLASS() //标识类参与反射

UPROPERTY()//标识属性参与反射

UFUNCTION()//标识函数参与反射

GENERATED_CODE//反射后的结果放置位置

反射实例

#include "MyObject.generated.h"//虚幻引擎将生成所有反射数据并将放入此文件
 
UCLASS(Blueprintable)//Blueprintable:此类可由蓝图延展
class UMyObject : public UObject
{
    GENERATED_BODY()
 
public:
    MyUObject();
 
    UPROPERTY(BlueprintReadOnly, EditAnywhere)//BlueprintReadOnly:此属性只可从蓝图读取,不可写入
    float ExampleProperty;//EditAnywhere:说明此属性可通过属性窗口在原型和实例上进行编辑
 
    UFUNCTION(BlueprintCallable)//BlueprintCallable:公开属性在蓝图代码中调用
    void ExampleFunction();
};

圾收集比较自动化,通过垃圾回收便无需手动删除 UObjects,只需维持对它们的有效引用即可。类须派生自 UObject,才能启用垃圾回收。

UCLASS()
class MyGCType : public UObject
{
    GENERATED_BODY()
};

二、创建一个c++类 

右键新建c++类后会出现两个新文件,一个.cpp格式的文件,一个.h格式的文件,其中.cpp文件是用来编写代码的,而.h文件是用来编写声明的,比如上面的反射和回收就是写在.h文件里面的。

虚幻引擎5 C++编程学习_第2张图片

三、UCLASS 宏的有效关键字

classGroup

此关键字用于在编辑器中设置显示该类的actor组。

Within

UCLASS(Within=PlayerController)

声明此类的实例应始终具有指定类的外部。除非被覆盖,否则它由子类继承。

BlueprintType

将此类公开为可用于蓝图中变量的类型。

NotBlueprintType

防止此类用于蓝图中的变量。

Blueprintable

将此类公开为创建蓝图的可接受基类。

NotBlueprintable

指定该类不是创建蓝图的可接受基类。

MinimalAPI

此关键字指示该类应该在其模块外部可以访问,但是不需要导出所有方法。仅导出为dynamic_cast <>等工作所需的自动生成的方法。

customConstructor

防止自动生成构造函数声明。

Intrinsic

类直接在C ++中声明,并且没有UnrealHeaderTool生成的样板。请勿在新课程上使用此标志。

noexport

不会为此类创建自动生成的代码;标头仅用于解析元数据。请勿在新课程上使用此标志。

placeable

表明该类可在虚幻编辑器内进行创建并被放置在关卡,UI场景,或蓝图内(取决于该类类型)。此标识被传递到所有的子类中,子类可使用 NotPlaceable 关键字来重载该标识。

notplaceable

否定从基类继承的Placeable关键字。表示在虚幻编辑器中不可以将这个类放置到关卡等位置。

DefaultToInstanced

此类的所有实例均被视为“实例”。实例化的类(组件)在构造时被复制。该标志由子类继承。

Const

此类中的所有属性和函数都是const,应将其导出为const。该标志由子类继承。

Abstract

类是抽象的,不能直接实例化。

deprecated

不推荐使用此类,并且在序列化时不会保存此类的对象。该标志由子类继承。

Transient

此类无法保存;在保存时将其清空。该标志由子类继承。

nonTransient

此类应正常保存(它会取消继承的瞬态标志)。

config

在构造时加载对象配置。这些标志被子类继承。包含配置属性的类。用法config = ConfigName或config = inherit(继承自基类的配置名称)。

perObjectConfig

根据每个对象而不是每个类来处理对象配置。

configdonotcheckdefaults

确定是否在序列化为配置时应在base / defaults ini的基础上进行检查

defaultconfig

仅将对象配置保存到默认INI,而不保存到本地INI。

editinlinenew

这些会影响属性编辑器的行为。可以通过editinline新建按钮构造类。

noteditinlinenew

无法通过editinline“新建”按钮构造类。

hidedropdown

未在编辑器下拉列表中显示的类用于选择类。

showCategories

在属性查看器中显示指定的类别。用法:showCategories = CategoryName或showCategories =(category0,category1,...)

hideCategories

在属性查看器中隐藏指定的类别。用法:hideCategories = CategoryName或hideCategories =(category0,category1,...)

ComponentWrapperClass

表示此类是组件的包装器类,而组件的内部功能很少(如果该类在蓝图中被子类化,则将导致hideCategories和showCategories之类的东西被忽略)

showFunctions

在属性查看器中显示指定的函数。用法:showFunctions = FunctionName或showFunctions =(category0,category1,...)

hideFunctions

在属性查看器中隐藏指定的函数。用法:hideFunctions = FunctionName或hideFunctions =(category0,category1,...)

autoExpandCategories

指定应在属性查看器中自动扩展哪些类别。

autoCollapseCategories

指定应在属性查看器中自动折叠哪些类别。

dontAutoCollapseCategories

清除自动折叠类别的列表。

collapseCategories

在编辑器中显示属性,而不使用类别。

dontCollapseCategories

使用类别(默认行为)在编辑器中显示属性。

AdvancedClassDisplay

默认情况下,该类的所有属性都隐藏在主显示中,并且仅在高级详细信息部分中显示。

ConversionRoot

根转换将子类限制为只能转换为层次结构中第一个根类的子类。

Experimental

将该类标记为“实验性”(完全不受支持和未记录的原型)

EarlyAccessPreview

将该类标记为“抢先体验”预览(虽然尚未考虑生产准备,但已超出“实验性”一步,将作为将来的预览提供)

SparseClassDataType

有些属性每个类在sidecar结构中存储一次,而不是在类的实例中存储。

Metadata

可在UCLASS中使用的元数据。


BlueprintSpawnableComponent

用于Actor组件类。如果存在,则表示可以由蓝图生成。

ChildCanTick

用于Actor和Component类。如果本机类不能打勾,则即使bCanBlueprintsTickByDefault为false,Blueprint生成的基于此Actor或Component的类也可以覆盖bCanEverTick标志。

用于Actor和组件类。如果本地类无法tick,那么可以覆盖基于此Actor或组件的蓝图生成类的 bCanEverTick 标签,即使 bCanBlueprintsTickByDefault 为false也同样如此。

ChildCannotTick

用于Actor和组件类。如果本地类无法tick,那么基于此Actor或组件的蓝图生成类则无法tick,即使 bCanBlueprintsTickByDefault 为true也同样如此。

IgnoreCategoryKeywordsInSubclasses

用于使类的第一个子类忽略所有继承的showCategories和hideCategories命令

DeprecatedNode

对于BehaviorTree节点,表明该类已弃用,并且在编译时将显示警告。

DeprecationMessage

DeprecationMessage="Message Text"

[ClassMetadata] [PropertyMetadata] [FunctionMetadata]与DeprecatedNode,DeprecatedProperty或DeprecatedFunction结合使用以自定义显示给用户的警告消息。

如果类已废弃,尝试编译使用此类的蓝图时,其将被添加到标准废弃警告。

DisplayName

[ClassMetadata] [PropertyMetadata] [FunctionMetadata]为该类,属性或函数显示的名称,而不是根据其名称自动生成的名称。

ToolTip

ToolTip="Hand-written tooltip"

覆盖从代码注释自动生成的提示文本。

ShortTooltip

ShortToolTip="Short tooltip"

完整提示文本过长时使用的简短提示文本,例如父类选取器对话。

ScriptName

[ClassMetadata] [PropertyMetadata] [FunctionMetadata]将类,属性或函数导出为脚本语言时要使用的名称。可以包括不赞成使用的名称,作为其他用分号分隔的条目。

IsBlueprintBase

IsBlueprintBase="true/false"

指定该类是创建蓝图的可接受基类。说明此类是否为创建蓝图的一个可接受基类,与 UCLASS 说明符、Blueprintable 或 'NotBlueprintable` 相似。

KismetHideOverrides

逗号分隔的蓝图事件列表,不允许在此类型的类中重写

ProhibitedInterfaces

指定与该类不兼容的接口。

RestrictedToClasses

由BlueprintFunctionLibrary类用于限制图形,可将库中的函数用于指定的类。

ShowWorldContextPin

说明放置在此类拥有的图表中的蓝图节点必须显式其World情景引脚(即使其通常状态下为隐藏也同样如此),因为此类的对象无法被用作World情景。

指示在将蓝图节点放置在此类拥有的图形中时,隐藏的世界上下文图钉应该可见,因为该类的自身上下文无法。

提供世界环境,必须手动将其连接。

DontUseGenericSpawnObject

不要使用“蓝图”中的“通用创建对象”节点来生成类的对象。仅对于既不是Actor也不是ActorComponent的BluprintType类,它才有意义。

ExposedAsyncProxy

在“异步任务”节点中公开此类的代理对象。

BlueprintThreadSafe

仅对蓝图函数库有效。将此类中的函数标记为在动画蓝图中的非游戏线程上可调用。

UsesHierarchy

指示该类使用分层数据。用于实例化详细信息面板中的分层编辑功能。

 虚幻引擎5 C++编程学习_第3张图片

报错:

虚幻引擎5 C++编程学习_第4张图片

由于UE5使用了livecode进行热编译,热编译时只会编译本身项目的工程,不会编译第三方插件的代码,可以关闭掉livecode编译

虚幻引擎5 C++编程学习_第5张图片

 

再次生成,成功:

虚幻引擎5 C++编程学习_第6张图片

 

四、加快unreal编译速度

在安装引擎的路径下找到下面的文件 

虚幻引擎5 C++编程学习_第7张图片

路径

E:\UE_5.0\Engine\Binaries\Win64

 文件名 UnrealHeaderTool.target

用notepad++打开

在第二行添加一个空格

虚幻引擎5 C++编程学习_第8张图片

未修改前:

 

生成反射文件耗时很久

修改后:

虚幻引擎5 C++编程学习_第9张图片

只要没有修改内容,反射文件就不会重复生成,大大减少了时间的损耗。 

PS:修改不需要关闭程序,修改后的第一次执行仍会生成反射文件,但是第二次及以后只要没有修改内容,反射文件就不会重复生成

并且是对不同版本的UE引擎都有效的,只要修改了一次,以后电脑上安装其他版本的引擎也不需要再进行修改了

你可能感兴趣的:(ue5,学习)