概述
原创文章,转载请注明出处。
***本篇为基础文章,主要为自己记录用。***
- 瞎掰
- 一些反射的UPRPERTY修饰符记录
- GameInstance/GameMode等逻辑常用类随笔
- 反射 标识符 随笔
- 类说明符 UCLASS(……)
- 元数据说明符
- 类元标签/数据说明符 UCLASS(meta=(……))
- 枚举类型元标签/数据说明符 UENUM (meta=(……))
- 枚举值(单个枚举值)元标签/数据说明符 UENUM (meta=(……))
- 接口元标签/数据说明符 UINTERFACE (meta=(……))
- 结构体元标签/数据说明符 USTRUCT (meta=(……))
- 函数元标签/数据说明符 UFUNCTION (meta=(……))
- 变量元标签/数据说明符 UPROPERTY (meta=(……))
- 函数说明符 UFUNCTION(……)
- 属性说明符 UPROPERTY(……)
- 游戏模块介绍
- 接口
- 共享指针
- 共享引用
- 弱指针WeakPtr
- 整形数据
- Bit数据
- 浮点类型数据
- 布尔类型数据
- 字符串类型数据
- 结构体UStruct
瞎掰
都是在CSDN里面纯手敲的代码,没在VS里面,可能会有错误。
主记录下面几个
AllowPrivateAccess
EditDefaultsOnly
BlueprintImplementableEvent
BlueprintNativeEvent
NativeBreakFunc
CompactNodeTitle = "Hello"
Keywords = "BlueprintSearchKey"
CommutativeAssociativeBinaryOperator = "true")
meta = (z = "1", Keywords = "Vector", NativeMakeFunc)
AdvancedDisplay
插值
FMath::RInterpTo()
//碰撞组件的Begin事件绑定, 要在BeginPlay之后调用,不允许在构造
pBoxComponent->OnComponentBeginOverlap.AddUniqueDynamic(this, &AMyClass::Func);
pBoxComponent->OnComponentHit.AddDynamic(this, &AMyClass::Func);
UFUNCTION()
void Func();
三渲二效果怎么做?
PostProcess->添加一个后期材质,材质PostProcess类型。回头放出下载链接
YourrMesh->SetRenderCustomDepth(true);
判断Actor是不是什么类型的Actor,除了Cast还能怎么做?
bool bRet = OtherActor->IsA(AMyActor::StaticCalss());
meta = (MultiLine = true) 多行反射标记 在编辑器中可以Alt+Enter换行
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (MultiLine = true))
FString ContentText;
一些反射的UPRPERTY修饰符记录
Rotating Movment组件, 附加到Mesh上会自动旋转
AllowPrivateAccess =
true: 打开私人属性,可访问
//默认蓝图编辑器显示, 但是蓝图不可以调用
UPROPERTY(EditDefaultsOnly, Category = UI)
float fHealth;
//蓝图可以编辑默认值, 蓝图可读变量参与逻辑, 但是不可写
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = UI)
float fHealth;
//蓝图可以编辑默认值, 蓝图可读写变量参与逻辑
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = UI)
float fHealth;
//蓝图可调用, 不支持重载
UFUNCTION(BlueprintCallable, Category = UI)
void TestFunc(FString);
//蓝图可调用的纯函数, 要有返回值, 没有返回值的纯函数是没有意义的
UFUNCTION(BlueprintCallable, BlueprintPure, Category)
FString TestFunc(FString);
//C++可以通过该标识符调用蓝图的逻辑
UFUNCTION(BlueprintImplementableEvent)
void TestFunc();
//C++可以通过该标识符调用蓝图的逻辑, 多了一个TestFunc_Implementation(),
//当蓝图没有实现TestFunc的主体函数的时候, 就会调用默认的TestFunc_Implementation
UFUNCTION(BlueprintNativeEvent)
void TestFunc();
void TestFunc_Implementation();
//NativeBreakFunc?结构体参数可以被打开, 结构体可以被Break产生全部的参数
UFUNCTION(BlueprintPure, Category = "Test", meta = (NativeBreakFunc))
void TestFunc(const FTestStruct& myStruct);
//DisplayName? 蓝图右键中菜单里面显示的名字
//CompactNodeTitle?有时候会看到纯函数上面会显示一个名字,这个就是干这个用的
//Keywords ? 蓝图中右键找函数的时候可以输入这个关键字来查找
//CommutativeAssociativeBinaryOperator?这么长干啥用的,有的节点大家能看到可以有一个(add pin +)
//这个就是干这个用的,可以添加节点(点add pin+会在float b下面出来多个float参数)
UFUNCTION(BlueprintPure, meta = (DisplayName = "Test", CompactNodeTitle = "Hello",
Keywords = "BlueprintSearchKey", CommutativeAssociativeBinaryOperator = "true"))
void TestFunc(float a, float b);
//上面是Break, 现在是Make
//z = "1"? 参数z默认值为1
//Keywords = "Vector"? 蓝图中右键可以通过关键字Vector找到函数
//NativeMakeFunc?干嘛的? Make函数的方法, 参数会被放到左侧,返回值在右侧,就例如我们在蓝图
//中MakeVector一样的效果
UFUNCTION(BlueprintPure, meta = (z = "1", Keywords = "Vector", NativeMakeFunc), Category)
FVector MakeVectorTestFunc(float x, float y, float z);
UENUM()
namespace MyCharacterType
{
enum Type
{
Type1,
Type2,
//……
};
}
//将枚举暴露给蓝图
UPROPERTY(EditDefaultsOnly, Category(Test))
TEnumAsByte<MyCharacterType::Type> TypeA;
//AdvancedDisplay?干嘛的?在蓝图中可以选择性的隐藏显示这个标签,就是默认没有显示这个变量,
//就比如Render里面的Occ等,Collision中信息的等
UPROPERTY(EditDefaultsOnly, Category(Test), AdvancedDisplay)
TEnumAsByte<MyCharacterType::Type> TypeB;
GameInstance/GameMode等逻辑常用类随笔
GameInstance->存在于全局,不会因为Level的卸载消失,比如SaveGame对象可以放这里
GameMode->对象仅存在于服务器上,当然你说我的客户端也有啊,你单机项目确实有
GameState->一些对局的判断,胜负等。每个客户端和服务器上都有该对象
PlayerState->关于角色的信息,状态的数据放在这。适用于所有已连接客户端的属性副本。
PlayerController->按键响应等 和Pawn相互持有
Pawn->Character->角色类 客户端服务器都存着有该数据
MyHUD->用的少,用的多的是UMG
PlayerState = GWorld->GetPlayerController(int32 index)->GetPlayerState
//蓝图中可选择派生自Actor的蓝图类
TSubclassof<AActor> MyTestActor;
/* sample code
TArray<APawn *> TestPawns;
...
// test iterator, all items
for ( TObjectArrayIterator<APawn> It(TestPawns); It; ++It )
{
UE_LOG(LogUObjectGlobals, Log, TEXT("Item %s"),*It->GetFullName());
}
*/
反射 标识符 随笔
C++ 是没有反射的
UE4
GC、序列化、网络复制、蓝图/C++通信 都是得益于UE4的反射
UCLASS()
USTRUCT()
GENERATED_BODY()
UPROPERTY()
UFUNCTION()
额外说明符
Blueprintable-此类可由蓝图延展
BlueprintReadOnly
类说明符
声明类时,可以为声明添加类说明符,以控制类相对于引擎和编辑器的各个方面的行为。
元数据说明符
声明类,接口,结构体,薄片,矩阵值,函数,或属性时,可添加元数据说明符来控制其与引擎和编辑器各方面的相处方式。自己的元数据说明符列表。
类可以使用以下元标签说明符:
:点击查看详细说明符链接地址
类说明符 UCLASS(……)
Abstract
摘要说明符会将类声明为“抽象基类”,阻止用户向关卡中添加此类的演员。对于单独存在时没有意义的类,此说明符非常有用。例如,'ATriggerBase`基类是抽象类,而`ATriggerBox`子类不是抽象类,可以放置在关卡中。
AdvancedClassDisplay
AdvancedClassDisplay说明符强制类的所有属性仅在显示这些属性的“细节(Details)”面板的“高级(Advanced)”部分中显示。要覆盖属性上方的此说明符,在该属性上使用`SimpleDisplay`说明符。
AutoCollapseCategories=(Category1, Category2, ...)
“ AutoCollapseCategories”说明符使父类上的。** AutoExpandCategories **说明符的列出类别的效果无效。
AutoExpandCategories=(Category1, Category2, ...)
因此类的对象指定应自动在虚幻编辑器属性窗口中展开的一个或多个类别。要自动展开未使用类别声明的变量,请使用声明变量的类的名称。
Blueprintable
替代为`NotBlueprintable`,除非继承时就并非如此。此说明符由子类继承。
BlueprintType
将此类公开为可用于蓝图的变量的类型。
ClassGroup=GroupName
指示在虚幻编辑器的演员浏览器中启用组视图(Group View)时,演员浏览器应在指定的GroupName中包含此类以及此类的所有子类。
CollapseCategories
指示类别的属性划分到虚幻编辑器属性窗口的类别中。此说明符会传播到子类,指出`DontCollapseCategories`说明符覆盖。
Config=ConfigName
指示此类可在配置文件(.ini)中存储数据。如果存在任何使用`config`或`globalconfig`说明符声明的类属性,此说明符将使这些属性存储在指定的配置文件中。此说明符会传播到所有子类并且无法使此说明符无效,但是子类可通过重新声明`config`说明符并提供不同的ConfigName`来更改配置文件。常见的`ConfigName`值是“ Engine”,“ Editor” “,”输入“和”游戏“。
Const
此类中的所有属性和函数都是`const`和导出为`const`。此说明符由子类继承。
ConversionRoot
根转换,将子类限制为仅可沿层级向上转换为第一个根类的子类。
CustomConstructor
阻止构造函数声明自动生成。
DefaultToInstanced
实例化的类(组件)将在构造时被复制。此说明符由子类继承。
DependsOn=(ClassName1, ClassName2, ...)
列出的所有类将先于于此类被编译。提供的类名必须指示同一个或前一个包中的类。可以使用分开的`DependsOn`行(以逗号分隔)来标识多个依赖类,或者可以通过为每个类使用单独的`DependsOn`行来指定多个依赖类。当某些类使用在另一个类中声明的结构体或枚举时,这非常重要,因为编译器仅知道它已编译了类中的某些部分。
Deprecated
此类已弃用,序列化时将不保存此类的对象。此说明符由子类继承。
DontAutoCollapseCategories=(Category, Category, ...)
使列出的类别的继承自父类的`AutoCollapseCategories`说明符无效。
DontCollapseCategories
使继承自基类的`CollapseCatogories`说明符无效。
EditInlineNew
指示可以从虚幻编辑器“属性(Property)”窗口创建此类的对象,而不是现有资源引用。否则行为是仅可通过“属性(Property)”窗口指定对现有对象的引用。符会传播到所有子类;子类可通过NotEditInlineNew说明符覆盖它。
HideCategories=(Category1, Category2, ...)
列出一个或多个应该对用户完全隐藏的分类。要隐藏未使用类别声明的属性,请使用声明变量的类的名称。此说明符会传播到子类。
HideDropdown
阻止此类在属性窗口组合下拉显示。
HideFunctions=(Category1, Category2, ...)
让指定分类中的所有函数都对用户完全隐藏。
HideFunctions=FunctionName
将提及的函数对用户完全隐藏。
Intrinsic
指示此类直接在C ++中声明,无虚幻标头工具生成的样板。不要在新类上使用此说明符。
MinimalAPI
导致仅继承此类的类型信息,以供其他模块使用。可以以此类为目标进行强制转换,但此类的功能无法调用(除了使用内联方法)。这可以扩展编译时间,因为没有针对无需从其他模块访问其所有函数的类导出一切。
NoExport
指示此类的声明包含包含在由标头生成器自动生成的C ++头文件中。必须在单独的头文件中手动定义该C ++类声明。仅对本地类有效。请勿对新类使用此说明符。
NonTransient
使继承自基类的`Transient`说明符无效。
NotBlueprintable
指定此类不是可用于创建蓝图的替代基类。此为替代说明符,将由子类继承。
NotPlaceable
使继承自基基类的`Placeable`说明符无效。指示不可以在编辑器中将此类的对象放置到关卡,UI场景或蓝图中。
PerObjectConfig
此类的配置信息将按对象存储,在.ini`文件中,每个对象都有一个分段,根据对象命名,格式为[ObjectName ClassName]`。此说明符会传播到子类。
Placeable
指示可在编辑器中创建此类,而且可将此类放置到关卡,UI场景或蓝图(属于类类型)中。此标志会传播到所有子类;子类可使用`NotPlaceable`说明符号覆盖此标志。
ShowCategories=(Category1, Category2, ...)
使列出的类别的继承自基类的`HideCategories`说明符无效。
ShowFunctions=(Category1, Category2, ...)
在属性查看器中显示列出的类别中的所有函数。
ShowFunctions=FunctionName
在属性查看器中显示指定的函数。
Transient
当与播放器或窗口等本质上不持久的特定种类的原生类配合使用时,它非常有用。 `说明符覆盖。
Within=OuterClassName
这意味着,要创建此类的对象,需要提供`OuterClassName`的一个实例作为其`Outer`对象。
元数据说明符
声明UClasses、UFunctions、UProperties、UEnums和UInterfaces时使用的元数据关键词,说明其与虚幻引擎和关卡编辑器诸多方面的互动方式。
也可以点我查看
类元标签/数据说明符 UCLASS(meta=(……))
BlueprintSpawnableComponent
如其存在,组件类电场蓝图生成。
BlueprintThreadSafe
仅在蓝图函数库上有效。此说明符将把此类中的函数在动画蓝图中的非游戏线程上标记为可调用。
ChildCannotTick
如果本地类无法打勾,那么基于此Actor或组件的蓝图生成类则无法打勾,即使bCanBlueprintsTickByDefault为true也同样如此。
ChildCanTick
如果本地类无法打勾,那么可以覆盖基于此Actor或组件的蓝图生成类的bCanEverTick标签,甚至bCanBlueprintsTickByDefault为false也同样如此。
DeprecatedNode
用于行为树例程,说明类已废弃,编译时将显示一条警告。
DeprecationMessage="Message Text"
如果类已废弃,尝试编译使用此类的蓝图时,其将被添加到标准废弃警告。
DisplayName="Blueprint Node Name"
此后在蓝图中的命名将被此处提供的值所取代,而不是代码生成的命名。
DontUseGenericSpawnObject
不使用蓝图的通用创建对象对象来生成类的一个对象。此说明符号只有在用于既非Actor又非ActorComponent的BluprintType类时才可用。
ExposedAsyncProxy
在异步任务上中公开这类的一个代理对象。
IgnoreCategoryKeywordsInSubclasses
为让一个类的首个子类忽略所有继承的ShowCategories和HideCategories说明符。
IsBlueprintBase="true/false"
说明此类是否为创建蓝图的一个可以接受基类,与UCLASS说明符,Blueprintable或'NotBlueprintable`相似。
KismetHideOverrides="Event1, Event2, .."
永久被覆盖的蓝图事件的列表。
ProhibitedInterfaces="Interface1, Interface2, .."
列出与类不兼容的接口。
RestrictedToClasses="Class1, Class2, .."
由蓝图函数库类使用,用于限制列表中命名类的用法。
ShortToolTip="Short tooltip"
完整提示文字过长时使用的替换提示文字,例如父类选取器对话。
ShowWorldContextPin
说明放置在此类拥有的图表中的蓝图报表必须显式的其世界情景样式(即使其通常状态下为隐藏也同样如此),因为此类的对象无法被使用。
UsesHierarchy
说明类使用层级数据。用于实例化“细节”面板中的层级编辑功能。
ToolTip="Hand-written tooltip"
覆盖从代码注释自动生成的提示文本。
枚举类型元标签/数据说明符 UENUM (meta=(……))
位标记(Bitflags)
表示整体UPROPERTY变量(使用“位置偏移”元数据说明符设置)可插入并放置标记。
实验性(Experimental)
植入类型标记为试验性和不支持。
ScriptName="Display Name"
将在编辑器中使用引证字符串作为此之后的命名,而不使用虚拟幻标头工具生成的替代命名。
ToolTip="Hand-written tooltip"
覆盖在代码注释中自动生成的提示文本。
枚举值(单个枚举值)元标签/数据说明符 UENUM (meta=(……))
DisplayName="Enumerated Value Name"
此处提供的文本将使用该值命名,而不是代码生成的命名。
Hidden
在编辑器中不显示该值。
ToolTip="Hand-written tooltip."
覆盖在代码注释中自动生成的提示文本。
接口元标签/数据说明符 UINTERFACE (meta=(……))
CannotImplementInterfaceInBlueprint
此接口无法被蓝图实现(例如,如果其只拥有未公开的C ++成员法)。定义非BlueprintImplementableEvent或BlueprintNativeEvent函数的任意接口必须声明为CannotImplementInterfaceInBlueprint。
结构体元标签/数据说明符 USTRUCT (meta=(……))
HasNativeBreak="Module.Class.Function"
说明此结构体拥有一个自定义中断结构。必须提供模块,类和函数命名。
HasNativeMake="Module.Class.Function"
说明此结构体拥有一个自定义中断结构。必须提供模块,类和函数命名。
HiddenByDefault
使Struct和Breakstruct中断中的并列为隐藏状态。
ShortToolTip="Short tooltip"
完整提示文字过长时使用的替换提示文字,例如父类选取器对话。
ToolTip="Hand-written tooltip
覆盖从代码注释自动生成的提示文本。
函数元标签/数据说明符 UFUNCTION (meta=(……))
AdvancedDisplay="Parameter1, Parameter2, .."
以逗号分隔的参数列表将显示为高级附件(需要UI扩展)。
AdvancedDisplay=N
用一个数字替代N,第N之后的所有参数将显示为高级前缀(需要UI扩展)。换句话说:“ AdvancedDisplay = 2”将把前两个之外的所有参数标记为高级。
ArrayParm="Parameter1, Parameter2, .."
说明BlueprintCallable函数应使用一个Call Array Function,并且列出的参数应被视为通配符数组属性。
ArrayTypeDependentParams="Parameter"
使用ArrayParm时,此说明符将指定一个参数,其将确定ArrayParm列表中所有参数的类型。
AutoCreateRefTerm="Parameter1, Parameter2, .."
如列出的参数(由引用传递)的插入未连接,其将拥有一个自动创建的替换项。这是蓝图的一个便利功能,经常在交错上方使用。
BlueprintAutocast
仅是由来自蓝图函数库的静态BlueprintPure函数使用。
BlueprintInternalUseOnly
此函数是一个内部实现细节,用于实现另一个函数或例程。其从未直接在蓝图图表中公开。
BlueprintProtected
此函数只能在蓝图中的拥有对象上调用。其无法在另一个实例上调用。
CallableWithoutWorldContext
用于拥有一个WorldContext主轴的BlueprintCallable函数,说明函数可被调用,即使其类不实现GetWorld函数也同样如此。
CommutativeAssociativeBinaryOperator
说明BlueprintCallable函数应使用可交换二元结合节点。此节点缺少引脚命名,拥有但一个创建³³额外输入侧引脚的添加引脚(添加PIN)按钮。
CompactNodeTitle="Name"
说明BlueprintCallable函数应在压缩显示模式中显示,并提供在该模式中显示的命名。
CustomStructureParam="Parameter1, Parameter2, ..")
此说明符需要UFUNCTION级别的说明符CustomThunk,,而它们又需要用户提供自定义的exec函数。在此函数中,可对参数类型进行检查,可根据这些参数类型执行适当的函数调用。永不停止调用基础UFUNCTION,出现错误时应进行断言或记录。
NOTE:要声明自定义exec函数,使用语法DECLARE_FUNCTION(execMyFunctionName),MyFunctionName为原函数命名。
DefaultToSelf
用于BlueprintCallable函数,说明对象属性的命名默认值应为先前的自我情境。
DeprecatedFunction
可使用DeprecationMessage元数据说明符添加到废弃警告消息(如提供说明如何替代已废弃的函数)。
DeprecationMessage=“邮件文字”
如果函数已废弃,尝试编译使用此函数的蓝图时,其将被添加到标准废弃警告。
DevelopmentOnly
被标记为DevelopmentOnly的函数只会在开发模式中运行。这适用于调试输出之类的功能(但其本身存在于发布产品中)。
DisplayName="Blueprint Node Name"
此后在蓝图中的命名将被此处提供的值所取代,而不是代码生成的命名。
ExpandEnumAsExecs="Parameter"
使用BlueprintCallable函数,说明应为参数使用的列举中的每个相互创建一个输入执行。命名参数必须是引擎通过UENUM标签识别的一个类别类型。
HidePin="Parameter"
用于BlueprintCallable函数,说明参数引脚应从用户视图中隐藏注意:使用此方式每个函数只能隐藏一个参数引脚。
HideSelfPin
隐藏在提示函数调用所处的对象的自身位置。self插入在与调用蓝图的类兼容的BlueprintPure函数上为自动隐藏状态。这通常与DefaultToSelf说明符共用。
InternalUseParam="Parameter"
与HidePin相似,这将在用户视图中隐藏命名参数的前缀,只能用于一个函数的一个参数。
KeyWords="Set Of Keywords"
指定在搜索此函数时可使用的一组关键字,例如适当放置在蓝色图图表中调用函数。
Latent
说明一个延迟操作。逐步操作拥有类型为FLatentActionInfo的一个参数,此参数由LatentInfo说明符命名。
LatentInfo="Parameter"
适用于延迟BlueprintCallable函数,说明其中参数是LatentInfo参数。
MaterialParameterCollectionFunction
用于BlueprintCallable函数,说明应使用材质覆盖例程。
NativeBreakFunc
用于BlueprintCallable函数,说明函数应以标准断裂结构的方式进行显示。
NotBlueprintThreadSafe
仅在蓝图函数库中有效。此函数将被视为拥有类的整体BlueprintThreadSafe元数据的一个例外。
ShortToolTip="Short tooltip"
完整提示文字过长时使用的替换提示文字,例如父类选取器对话。
ToolTip="Hand-written tooltip
覆盖从代码注释自动生成的提示文本。
UnsafeDuringActorConstruction
在Actor构造时调用此函数并非安全操作。
WorldContext="Parameter"
由BlueprintCallable函数使用,说明其中参数决定运算正在发生的世界。
变量元标签/数据说明符 UPROPERTY (meta=(……))
AllowAbstract="true/false"
用于Subclass和SoftClass属性。说明抽象类属性是否应显示在类拾取器中。
AllowedClasses="Class1, Class2, .."
适用FSoftObjectPath属性。逗号分隔的列表,表明要显示在资源选取器中的资源类类型。
AllowPreserveRatio
用于Fvector属性。在细节面板中显示此属性时将添加一个比率锁。
ArrayClamp="ArrayProperty"
为整体属性。将可在UI中输入的有效值锁定在0和命名数组属性的长度之间。
AssetBundles
为SoftObjectPtr或SoftObjectPath属性。主数据资源中使用的束列表命名,指定此引用属于其中束的一部分。
BlueprintBaseOnly
为Subclass和SoftClass属性。说明蓝图类是否应显示在类拾取器中。
BlueprintCompilerGeneratedDefaults
属性类别项由蓝图编译器生成,CopyPropertiesForUnrelatedObjects在编译后调用时将不会被复制。
ClampMin="N"
用于浮点和整体属性。指定可在属性中输入的预设N。
ClampMax="N"
用于浮点和整体属性。指定可在属性中输入的替代N。
ConfigHierarchyEditable
此属性被序列化为一个配置(.ini)文件,可在配置层级中的任意处进行设置。
ContentDir
由FDirectoryPath属性使用。说明将使用Content文件夹中的Slate样式目录选取器来选择路径。
DisplayAfter="PropertyName"
在蓝图编辑器中,称为PropertyName的属性后即刻显示此属性。其他是两个属性属于同一类别,则忽略其在源代码中的顺序进行显示。如多个属性具有相同的DisplayAfter值和相同的DisplayPriority值,将在指定属性之后,按照自身在标头文件中声明的顺序显示。
DisplayName="Property Name"
此属性显示的命名,不显示代码生成的命名。
DisplayPriority="N"
如两个属性有相同的DisplayAfter值,或属于同一类别且无DisplayAfter元标签,则此属性将决定其顺序。最高优先级变量1,表示DisplayPriority变量1的属性将在DisplayProirity变量2的属性之上显示。如多个属性有相同的DisplayAfter值,其将按照在标头文件中声明的顺序显示。
DisplayThumbnail="true"
说明属性是一个资源类型,其应显示补充资源的替代。
EditCondition="BooleanPropertyName"
对一个布尔属性进行命名,此属性用于说明此属性的编辑是否被替换。将“!”放置在属性命名前可颠倒测试。
EditFixedOrder
使排序的元素无法通过拖拽来重新排序。
NOTE:它现在由完全成熟的算式解析器计算,意味着可以包含一个完整的C ++表达式。
ExactClass="true"
结合AllowedClasses有用的FSoftObjectPath属性。说明是否只能使用AllowedClasses中指定的正确类,或子类是否同样有效。
ExposeFunctionCategories="Category1, Category2, .."
在蓝图编辑器中编译一个函数列表时,指定其函数应被公开的类目的列表。
ExposeOnSpawn="true"
指定此属性是否应在此类类型的一个Spawn Actor上上公开。
FilePathFilter="FileType"
由FFilePath属性使用。说明在文件选取器中显示的路径过滤器。常规值包括“uasset”和“UMAP”,但这些并非唯一可能的值。
GetByRef
使该属性的“ Get”蓝图例程返回对属性的常量引用,而不是其值的副本。只对稀疏类数据体现,只能在不存在NoGetter时使用。
HideAlphaChannel
为Fcolor和FLinearColor属性。说明详细显示属性控件时Alpha属性应为隐藏状态。
HideViewOptions
为Subclass和SoftClass属性。隐藏在类选取器中修改显示选项的功能。
InlineEditConditionToggle
该表布尔布尔属性仅内联显示为其他属性中的一个编辑条件切换,而不显示其自身的行上。
LongPackageName
由FDirectoryPath属性使用。将路径转换为一个长的包命名。
MakeEditWidget
说明属性应在视口中公开为一个可移动控件。
NoGetter
防止蓝图为该属性生成一个“ get”例程。只对稀疏类数据生效。
函数说明符 UFUNCTION(……)
BlueprintAuthorityOnly
如果在具有网络权限的机器上运行(服务器,专用服务器或单人游戏),此函数将仅从蓝图代码执行。
BlueprintCallable
此函数可在蓝图或关卡蓝图图表中执行。
BlueprintCosmetic
此函数为修饰性的,无法在专用服务器上运行。
BlueprintImplementableEvent
此函数可在蓝图或关卡蓝图图表中实现。
BlueprintNativeEvent
此声明将被蓝图覆盖掉,但是也具有完全原始实现。用于声明名称与主函数相同的附加函数,但是末尾添加了`实现,是写入代码的位置。如果未找到任何蓝图覆盖,该自动生成的代码将调用 。
BlueprintPure
此函数不对拥有它的对象产生任何影响,可在蓝图或关卡蓝图图表中执行。
CallInEditor
可通过细节(Details)面板`中的按钮在编辑器中的替代实例上调用此函数。
Category = "TopCategory|SubCategory|Etc"
在蓝图编辑工具中显示时指定函数的类别。运算符定义嵌入类别。
Client
此函数仅在拥有在其上调用此函数的对象的客户端上执行。用于声明名称与主函数相同的附加函数,但是末尾添加了`实现。必要时,此自动生成的代码将调用 Implementation`方法。
CustomThunk
UnrealHeaderTool代码生成器将不规范函数生成thunk,用户需要自己通过DECLARE_FUNCTION或DEFINE_FUNCTION宏来提供thunk。
Exec
此函数可从游戏内部控制台执行。仅在特定类中声明时,Exec命令才有效。
NetMulticast
此函数将在服务器上本地执行,也将复制到所有客户端上,NetOwner无论该Actor的为何。
Reliable
此函数将通过网络复制,并且一定会到达,甚至出现过多或网络错误。仅在与`Client`或`Server`配合使用时才有效。
SealedEvent
无法在子类中覆盖此函数。SealedEvent`关键词只能用于事件。对于非事件函数,请将它们声明为`static`或`final,以密封它们。
ServiceRequest
此函数为RPC(远程过程调用)服务请求。这意味着NetMulticast和Reliable。
ServiceResponse
此函数为RPC服务响应。这意味着NetMulticast和Reliable。
Server
此函数仅在服务器上执行。用于声明名称与主函数相同的附加函数,但是末尾添加了_Implementation,是写入代码的位置。必要时,此自动生成的代码将调用_Implementation方法。
Unreliable
此函数将通过网络复制,但可能会因限制或网络错误而失败。仅在与`Client`或`Server`配合使用时才有效。
WithValidation
使用声明名称与主函数相同的附加函数,但是末尾需要添加`_Validate`。此函数使用相同的参数,但会返回`bool`,以指示是否应继续调用主函数。
属性说明符 UPROPERTY(……)
也可以点击跳转到官网属性说明符
AdvancedDisplay
属性将被放置在其出现的任意面板的高级(下拉)部分中。
AssetRegistrySearchable
AssetRegistrySearchable 说明符说明此属性与其值将被自动添加到将此包含为成员变量的所有资源类实例的资源注册表。不可在结构体属性或参数上使用。
BlueprintAssignable
只能与组播委托共用。公开属性在蓝图中指定。
BlueprintAuthorityOnly
此属性必须为一个组播委托。在蓝图中,其只接受带 BlueprintAuthorityOnly 标签的事件。
BlueprintCallable
仅用于组播委托。应公开属性在蓝图代码中调用。
BlueprintGetter=GetterFunctionName
此属性指定一个自定义存取器函数。如此属性不带 BlueprintSetter 或 BlueprintReadWrite 标签,则其为隐式 BlueprintReadOnly。
BlueprintReadOnly
此属性可由蓝图读取,但不能被修改。此说明符与 BlueprintReadWrite 说明符不兼容。
BlueprintReadWrite
可从蓝图读取或写入此属性。此说明符与 BlueprintReadOnly 说明符不兼容。
BlueprintSetter=SetterFunctionName
此属性拥有一个自定义编译函数,被隐式标记为 BlueprintReadWrite。注意:必须对变异函数进行命名,并为相同类的一部分。
Category="TopCategory|SubCategory|..."
指定在蓝图编辑工具中显示时的属性类别。使用 | 运算符定义嵌套类目。
Config
此属性将被设为可配置。当前值可被存入与类相关的 .ini 文件中,创建后将被加载。无法在默认属性中给定一个值。暗示为 BlueprintReadOnly。
DuplicateTransient
说明在任意类型的复制中(复制/粘贴、二进制复制等),属性的值应被重设为类默认值。
EditAnywhere
说明此属性可通过属性窗口在原型和实例上进行编辑。此说明符与所有"可见"说明符均不兼容。
EditDefaultsOnly
说明此属性可通过属性窗口进行编辑,但只能在原型上进行。此说明符与所有"可见"说明符均不兼容。
EditFixedSize
只适用于动态数组。这能防止用户通过虚幻编辑器属性窗口修改数组长度。
EditInline
允许用户在虚幻编辑器的属性查看器中编辑此属性所引用的Object的属性(只适用于Object引用,包括Object引用的数组)。
EditInstanceOnly
说明此属性可通过属性窗口进行编辑,但只能在实例上进行,不能在原型上进行。此说明符与所有"可见"说明符均不兼容。
Export
只适用于Object属性(或Object数组)。说明Object被复制时(例如复制/粘贴操作)指定到此属性的Object应整体导出为一个子Object块,而非只是输出Object引用本身。
GlobalConfig
工作原理与 Config 相似,不同点是无法在子类中进行覆盖。无法在默认属性中对其给定一个值。暗示为 BlueprintReadOnly。
Instanced
仅限Object(UCLASS)属性。此类的一个实例创建时,其将被给定一个Object的特殊副本,指定到默认项中的此属性。用于实例化类默认属性中定义的子Object。暗示为 EditInline 和 Export。
Interp
说明值可随时间由Matinee中的一个轨迹驱动。
Localized
此属性的值将拥有一个定义的本地化值。多用于字符串。暗示为 ReadOnly。
Native
属性为本地:C++代码负责对其进行序列化并公开到垃圾回收。
NoClear
阻止从编辑器将此Object引用设为空。隐藏编辑器中的清除(和浏览)按钮。
NoExport
只适用于本地类。此属性不应包含在自动生成的类声明中。
NonPIEDuplicateTransient
属性将在复制中被重设为默认值,除非其被复制用于PIE会话。
NonTransactional
说明对此属性值的修改不会包含在编辑器的撤销/重新执行历史中。
NotReplicated
跳过复制。这只会应用到服务请求函数中的结构体成员和参数。
Replicated
属性应随网络进行复制。
ReplicatedUsing=FunctionName
ReplicatedUsing 说明符指定一个回调函数,其在属性通过网络更新时执行。
RepRetry
只适用于结构体属性。如果此属性未能完全发送(举例而言:Object引用尚无法通过网络进行序列化),则重新尝试对其的复制。对简单引用而言,这是默认选择;但对结构体而言,这会产生带宽开销,并非优选项。因此在指定此标签之前其均为禁用状态。
SaveGame
此说明符可简便地将域显式包含,用于属性关卡中的检查点/保存系统。应在作为游戏存档一部分的所有域上设置此标签,并使用代理归档器对其进行读写。
SerializeText
本地属性应被序列化为文本(ImportText、ExportText)。
SkipSerialization
此属性不会被序列化,但仍能导出为一个文本格式(例如用于复制/粘贴操作)。
SimpleDisplay
出现在 细节 面板中的可见或可编辑属性,无需打开"高级"部分即可见。
TextExportTransient
此属性将不会导出为一个文本格式(因此其无法用于复制/粘贴操作)。
Transient
属性为临时,意味着其无法被保存或加载。以此方法标记的属性将在加载时被零填充。
VisibleAnywhere
说明此属性在所有属性窗口中可见,但无法被编辑。此说明符与"Edit"说明符不兼容。
VisibleDefaultsOnly
说明此属性只在原型的属性窗口中可见,无法被编辑。此说明符与所有"Edit"说明符均不兼容。
VisibleInstanceOnly
说明此属性只在实例的属性窗口中可见(在原型属性窗口中不可见),无法被编辑。此说明符与所有"Edit"说明符均不兼容。
游戏模块介绍
认识清楚所有的模块都是DLL就好了。游戏模块编译成DLL的游戏项目的游戏性相关类的集合。
1>介绍
这些引擎模块由以前的版本中的包的概念,它们都是一组相关类的容器。在虚幻引擎4中,
由于游戏逻辑都可以通过C ++实现,所以模块实际上是DLL文件
接口
1>介绍
接口类有助于确保一组(可能)不相关的类实现一组通用函数。
在某些游戏功能可能被大量复杂而不同的类共享的情况下,这非常有用。例如,
某个游戏可能有这样一个系统,依靠该系统输入一个触发器体积可以激活陷阱、
警告敌人或向玩家奖励点数。这可以通过针对陷阱、
敌人和点数奖励器执行"ReactToTrigger"函数来实现。然而,陷阱可能派生自"AActor",
敌人可能派生自专门的"APawn"或"ACharacter"子类,点数奖励可能派生自"UDataAsset"。
所有这些类都需要共享功能,但它们没有除"UObject"之外的共同上级。在这种情况下,推荐使用接口。
2>实现
#pragma once
#include "ReactToTriggerInterface.generated.h"
UINTERFACE(MinimalAPI, Blueprintable)
class UReactToTriggerInterface : public UInterface
{
GENERATED_BODY()
};
class IReactToTriggerInterface
{
GENERATED_BODY()
public:
/** 在此处添加接口函数声明 */
};
"前缀为U(U-prefixed)"的类不需要构造函数或任何其他函数,而"前缀为I(I-prefixed)"的类将包含所有接口函数,且此类实际上将被您的其他类继承。
PS:如果您想要让蓝图实现此接口,则需要"Blueprintable"说明符。
3>接口说明符
"BlueprintType"
将该类公开为可用于蓝图中的变量的类型。
"DependsOn=(ClassName1, ClassName2, ...)"
所有列出的类都将在该类之前编译。ClassName必须在同一个(或上一个)包中指定一个类。多个依赖性类可以使用以逗号分隔的单个"DependsOn"行来指定,也可以使用单个"DependsOn"行为每个类指定。当一个类使用在另一个类中声明的结构体或枚举时,这一点非常重要,因为编译器只知道它已经编译的类中的内容。
"MinimalAPI"
仅导致该类的类型信息被导出以供其他模块使用。您可以向该类转换,但不能调用该类的函数(内联方法除外)。对于不需要其所有函数在其他模块中均可供访问的类,通过不导出这些类的所有内容,这可以缩短编译时间。
4>在C++中实现接口
若要在一个新的类中使用您的接口,只需从"前缀为I(I-prefixed)"的接口类继承
(除了您正在使用的任何基 于"UObject"的类)即可。
Trap.h
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ReactToTriggerInterface.h"
#include "Trap.generated.h"
UCLASS(Blueprintable, Category="MyGame")
class ATrap : public AActor, public IReactToTriggerInterface
{
GENERATED_BODY()
public:
/** Add interface function overrides here. */
}
5>确定类是否实现了接口
为了与实现接口的C++和蓝图类兼容,可以使用以下任意函数:
bool bIsImplemented = OriginalObject->GetClass()->ImplementsInterface(UReactToTriggerInterface::StaticClass()); // 如果OriginalObject实现了UReactToTriggerInterface,则bisimplemated将为true。
bIsImplemented = OriginalObject->Implements<UReactToTriggerInterface>(); // 如果OriginalObject实现了UReactToTrigger,bIsImplemented将为true。
IReactToTriggerInterface* ReactingObject = Cast<IReactToTriggerInterface>(OriginalObject); // 如果OriginalObject实现了UReactToTriggerInterface,则ReactingObject将为非空。
NOTE:如果"StaticClass"函数在"前缀为I(I-prefixed)"的类中没有实现,尝试在"前缀为U(U-prefixed)"的类上使用"转换(Cast)"将失败,代码将无法编译。
6>转换到其他虚幻类型
虚幻引擎的转换系统支持从一个接口转换到另一个接口,或者在适当的情况下,从一个接口转换到一个虚幻类型。
IReactToTriggerInterface* ReactingObject = Cast<IReactToTriggerInterface>(OriginalObject); // 如果接口被实现,则ReactingObject将为非空。
ISomeOtherInterface* DifferentInterface = Cast<ISomeOtherInterface>(ReactingObject); // 如果ReactingObject为非空而且还实现了ISomeOtherInterface,则DifferentInterface将为非空。
AActor* Actor = Cast<AActor>(ReactingObject); // 如果ReactingObject为非空且OriginalObject为AActor或AActor派生的类,则Actor将为非空。
7>蓝图可实现类
如果您想要蓝图能够实现此接口,则必须使用"Blueprintable"元数据说明符。
蓝图类要覆盖的每个接口函数都必须是"BlueprintNativeEvent"或"BlueprintImplementableEvent"。
标记为"BlueprintCallable"的函数仍然可以被调用,但不能被覆盖。您将无法从蓝图访问所有其他函数。
共享指针
共享指针一种支持共享拥有、自动失效、弱引用等特性的智能指针。
1>介绍
共享指针(Shared Pointers) 是指既健壮、又能为空指针的智能指针。共享指针沿袭了普通智能指针的所有优点,
它能避免出现内存泄漏、悬挂指针,还能避免指针指向未初始化的内存。但它们还有一些其他特点,例如:
a)共享所有权(Shared Ownership): 引用计数支持多个共享指针,以确保它们引用的数据对象永远不被删除,
前提是它们中的任意一个仍指向数据对象。
b)自动失效(Automatic Invalidation): 你可安全引用易变对象,无需担心出现悬挂指针。
弱引用: 弱指针可中断引用循环。
c)意向指示(Indication of Intent): 区分拥有者(参见共享引用)和观察者,并提供不可为空的引用。
共享指针有一些值得注意的基本特性,包括:
a)语法非常健壮
b)非侵入式(但能反射)
c)线程安全(视情况而定)
d)性能佳,占用内存少
NOTE:共享指针类似于共享引用,主要区别在于共享引用不可为空,因此会始终引用有效对象。在共享引用和共享指针之间进行选择时,除非需要空对象或可为空的对象,否则建议你优先选择共享引用。
2>声明和初始化
因为共享指针可为空,所以无论有无数据对象,都可以对它们进行初始化。以下是创建共享指针的一些示例:
// 创建一个空白的共享指针
TSharedPtr EmptyPointer;
// 为新对象创建一个共享指针
TSharedPtr<FMyObjectType> NewPointer(new FMyObjectType());
// 从共享引用创建一个共享指针
TSharedRef<FMyObjectType> NewReference(new FMyObjectType());
TSharedPtr<FMyObjectType> PointerFromReference = NewReference;
// 创建一个线程安全的共享指针
TSharedPtr<FMyObjectType, ESPMode::ThreadSafe> NewThreadsafePointer = MakeShared<FMyObjectType, ESPMode::ThreadSafe>(MyArgs);
在第二个示例中,NodePtr 实际上拥有新的 FMyObjectType 对象,因为没有其他共享指针引用该对象。如果 NodePtr 超出范围,并且没有其他共享指针或共享引用指向该对象,那么该对象将被销毁。
复制共享指针时,系统将向它引用的对象添加一个引用。
// 增加任意对象ExistingSharedPointer引用的引用数。
TSharedPtr<FMyObjectType> AnotherPointer = ExistingSharedPointer;
对象将持续存在,直到不再有共享指针(或共享引用)引用它为止。
你可以使用 Reset 函数、或分配一个空指针来重设共享指针,如下所示:
PointerOne.Reset();
PointerTwo = nullptr;
// PointerOne和PointerTwo现在都引用nullptr。
你可以使用 MoveTemp(或 MoveTempIfPossible)函数将一个共享指针的内容转移到另一个共享指针,将原始的共享指针保留为空:
// 将PointerOne的内容移至PointerTwo。在此之后,PointerOne将引用nullptr。
PointerTwo = MoveTemp(PointerOne);
// 将PointerTwo的内容移至PointerOne。在此之后,PointerTwo将引用nullptr。
PointerOne = MoveTempIfPossible(PointerTwo);
NOTE:MoveTemp 和 MoveTempIfPossible 的唯一不同之处在于 MoveTemp 包含静态断言,强制其只能在非常量左值(lvalue)上执行。
3>在共享指针与共享引用之间进行转换
在共享指针与共享引用之间进行转换是一种常见的做法。共享引用隐式地转换为共享指针,并提供新的共享指针将引用有效对象的额外保证。转换由普通语法处理:
TSharedPtr<FMyObjectType> MySharedPointer = MySharedReference;
只要共享指针引用了一个非空对象,你就可以使用 Shared Pointer 函数 ToSharedRef 从此共享指针创建一个共享引用。试图从空共享指针创建共享引用将导致程序断言。
// 在解引用之前,请确保共享指针有效,以避免可能出现的断言。
if (MySharedPointer.IsValid())
{
MySharedReference = MySharedPointer.ToSharedRef();
}
4>对比
你可以测试共享指针彼此间的相等性。在此情境中,相等被定义为两个共享指针引用同一对象。
TSharedPtr<FTreeNode> NodeA, NodeB;
if (NodeA == NodeB)
{
// ...
}
IsValid 函数和 bool 运算符有助于判断共享指针是否引用了有效对象。你还可以调用 Get,查看它是否返回有效的(非空)对象指针。
if (Node.IsValid())
{
// ...
}
if (Node)
{
// ...
}
if (Node.Get() != nullptr)
{
// ...
}
5>解引用和访问
你可以像使用普通C++指针那样解引用,调用方法和访问成员。你也可以像使用其他C++指针那样,通过调用 IsValid 函数或使用重载的 bool 运算符,在取消引用之前执行空检查。
// 在解引用前,检查节点是否引用了一个有效对象。
if (Node)
{
// 以下三行代码中的任意一行都能解引用节点,并且对它的对象调用ListChildren:
Node->ListChildren();
Node.Get()->ListChildren();
(*Node).ListChildren();
}
6>自定义删除器
共享指针和共享引用支持对它们引用的对象使用自定义删除器。如需运行自定义删除代码,请提供lambda函数,作为创建智能指针时使用的参数,就像这样:
void DestroyMyObjectType(FMyObjectType* ObjectAboutToBeDeleted)
{
// 此处添加删除代码。
}
// 这些函数使用自定义删除器创建指南指针。
TSharedRef<FMyObjectType> NewReference(new FMyObjectType(), [](FMyObjectType* Obj){ DestroyMyObjectType(Obj); });
TSharedPtr<FMyObjectType> NewPointer(new FMyObjectType(), [](FMyObjectType* Obj){ DestroyMyObjectType(Obj); });
共享引用
共享引用不能为未初始化或分配为空的智能指针类型。
1>介绍
共享引用 是一类强大且不可为空的 智能指针,其被用于引擎的 Uobject 系统外的数据对象。
此意味无法重置共享引用、向其指定空对象,或创建空白引用。因此共享引用固定包含有效对象,
甚至未拥有 IsValid 方法。在共享引用和 [共享指针](Shared Pointers) 间选择时,
除非需要空白或可为空的对象,否则共享引用为优先选项。如需可能空白或可为空的引用,则应使用共享指针。
与标准的C++引用不同,可在创建后将共享引用重新指定到另一对象。
1>声明和初始化
共享引用不可为空,因此初始化需要数据对象。在无有效对象的情况下尝试创建的共享引用将不会编译,并尝试将共享引用初始化为空指针变量。
//创建新节点的共享引用
TSharedRef<FMyObjectType> NewReference = MakeShared<FMyObjectType>();
在无有效对象的情况下尝试创建的共享引用将不会编译:
//以下两者均不会编译:
TSharedRef<FMyObjectType> UnassignedReference;
TSharedRef<FMyObjectType> NullAssignedReference = nullptr;
//以下会编译,但如NullObject实际为空则断言。
TSharedRef<FMyObjectType> NullAssignedReference = NullObject;
2>共享指针和共享引用间的转换
共享指针和共享引用间的转换十分常见。共享引用会隐式转换为共享指针,并为新共享指针引用有效对象提供额外保证。使用普通语法处理转换:
TSharedPtr<FMyObjectType> MySharedPointer = MySharedReference;
如共享指针引用非空对象,即可使用 共享指针 函数 ToSharedRef,在共享指针中创建共享引用。尝试在空共享指针中创建共享引用,将导致程序断言。
//在取消引用前,确保共享指针为有效,避免潜在断言。
If (MySharedPointer.IsValid())
{
MySharedReference = MySharedPointer.ToSharedRef();
}
3>比较
可测试共享引用彼此是否相等。在此情况下,相等表示引用相同对象。
TSharedRef<FMyObjectType> ReferenceA, ReferenceB;
if (ReferenceA == ReferenceB)
{
// ...
}
弱指针WeakPtr
弱指针 存储弱引用且不阻止其对象被销毁的智能指针。
1>介绍
弱指针 存储对象的弱引用。与 共享指针 或 共享引用 不同,弱指针不会阻止其引用的对象被销毁。
在访问弱指针引用的对象前,应使用 Pin 函数生成共享指针。此操作确保使用该对象时其将继续存在。如只需要确定弱指针是否引用对象,可将其与 nullptr 比较,或在之上调用 IsValid。
TIPS:弱指针的使用有助于授予意图——弱指针表明对引用对象的观察,而无需所有权,同时不控制其生命周期。
2>声明、初始化和分配
可创建空白弱指针,或在共享引用、共享指针或其他弱指针中进行。
//分配新的数据对象,并创建对其的强引用。
TSharedRef<FMyObjectType> ObjectOwner = MakeShared<FMyObjectType>();
//创建指向新数据对象的弱指针。
TWeakPtr<FMyObjectType> ObjectObserver(ObjectOwner);
弱指针不会阻止对象被销毁。在范例中,无论 ObjectOwner 是否在范围内,重置 ObjectOwner 都将销毁对象:
//假设ObjectOwner是其对象的唯一拥有者,ObjectOwner停止引用该对象时,该对象将被销毁。
ObjectOwner.Reset();
//ObjectOwner引用空对象,因此Pin()生成的共享指针将也将为空。被视为布尔时,空白共享指针的值为false。
if (ObjectObserver.Pin())
{
//只当ObjectOwner非对象的唯一拥有者时,此代码才会运行。
check(false);
}
与共享指针相同,弱指针是否引用有效对象,均可进行安全复制:
TWeakPtr<FMyObjectType> AnotherObjectObserver = ObjectObserver;
使用完弱指针后,可进行重置。
//可通过将弱指针设为nullptr进行重置。
ObjectObserver = nullptr;
//也可使用重置函数。
AnotherObjectObserver.Reset();
3>转换为共享指针
Pin 函数将创建指向弱指针对象的共享指针。只要共享指针在范围内且引用对象,则该对象将持续有效。此外,共享指针(包括由 Pin 函数返回的指针)可在条件句中作为 布尔 类型进行求值,其中 true 表示有效对象。以下代码模式检查弱指针是否引用有效对象。如是,至少在共享指针(由 Pin 函数创建)超出范围或被显式清除前,将保证其持续有效。
//获取弱指针中的共享指针,并检查其是否引用有效对象。
if (TSharedPtr<FMyObjectType> LockedObserver = ObjectObserver.Pin())
{
//共享指针仅在此范围内有效。
//该对象已被验证为存在,而共享指针阻止其被删除。
LockedObserver->SomeFunction();
}
4>取消引用和访问
要访问弱指针的对象,首需使用 Pin 函数,将其提升为共享指针。然后可通过共享指针或弱指针上的 Get 函数进行访问。此方法可确保使用该对象时,其将持续有效。
5>打破引用循环
两个或多个对象使用智能指针保持彼此间的强引用时,将出现引用循环。在此类情况下,对象间会相互保护以免被删除。各对象固定被另一对象引用,因此对象无法在另一对象存在时被删除。如外部对象未对引用循环中对象进行引用,其实际上将出现泄漏。弱指针不会保留自身引用的对象,因此其可中断此类引用循环。要在未拥有对象时对其进行引用,并延长其寿命时,可使用软指针。
6>使用警告
如不想保证数据对象会持续存在时,弱指针将非常有用,但该属性可能会变得异常危险。在以下情况中请谨慎使用弱指针:
**在集或映射中用作键。弱指针可能会在未通知容器的情况下随时无效,因此共享指针或共享引用更适用于充当键。可安全地将弱指针用作数值。
虽然弱指针提供 IsValid 函数,但是检查 IsValid 无法保证对象在任何时间长度内均可持续有效。线程安全共享指针可能会因另一线程上的活动而随时无效,因此使用线程安全共享指针应尤其注意。Pin 返回的共享指针将使对象在代码将其清除或其超出范围前保持活跃状态,因此 Pin 函数是用于检查的首选方法,此类检查会导致取消引用或访问存储对象。
整形数据
uint8
8位无符号
uint16
16位无符号
uint32
32位无符号
uint64
64位无符号
int8
8位有符号
int16
16位有符号
int32
32位有符号
int64
64位有符号
Bit数据
取值范围0-255
将整个属性标记为位置细分,只需在meta分段中添加“ bitmask”即可,如下所示:
UPROPERTY(EditAnywhere, Meta = (Bitmask))
int32 BasicBits;
浮点类型数据
虚幻使用标准C ++浮点类型,浮点和双精度。
虚幻使用标准C ++浮点类型,浮点和双精度。
布尔类型数据
布尔类型可以使用C ++ ool关键字表示或表示为位域。
uint32 bIsHungry :1;
bool bIsThirsty;
字符串类型数据
虚幻引擎4支持三种核心类型的字符串。
1>FString是典型的"动态字符数组"字符串类型。
2>FName是对全局字符串表中不可变且不区分大小写的字符串的引用。相较于FString,它的大小更小,更能高效的传递,但更难以操控。
3>FText是指定用于处理本地化的更可靠的字符串表示。
对于大多数情况下,虚幻依靠TCHAR类型来表示字符。TEXT()宏可用于表示TCHAR文字。
MyDogPtr->DogName = FName(TEXT("Samson Aloysius"));
有关这三种字符串类型、何时使用哪个类型以及如何使用它们的更多信息,
请参阅字符串处理文档。
结构体UStruct
UStruct也是支持反射的,但是不是继承自UObject,所以不支持垃圾回收,
如果动态New的UStruct,那么需要你去自己清理维护内存,可以用只能指针。
最后
以上就是寂寞仙人掌为你收集整理的UE4 随笔 反射标记符记录 持续更新瞎掰一些反射的UPRPERTY修饰符记录GameInstance/GameMode等逻辑常用类随笔反射 标识符 随笔类说明符 UCLASS(……)元数据说明符函数说明符 UFUNCTION(……)属性说明符 UPROPERTY(……)游戏模块介绍接口共享指针共享引用弱指针WeakPtr整形数据Bit数据浮点类型数据布尔类型数据字符串类型数据结构体UStruct的全部内容,希望文章能够帮你解决UE4 随笔 反射标记符记录 持续更新瞎掰一些反射的UPRPERTY修饰符记录GameInstance/GameMode等逻辑常用类随笔反射 标识符 随笔类说明符 UCLASS(……)元数据说明符函数说明符 UFUNCTION(……)属性说明符 UPROPERTY(……)游戏模块介绍接口共享指针共享引用弱指针WeakPtr整形数据Bit数据浮点类型数据布尔类型数据字符串类型数据结构体UStruct所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复