UE4 C++学习 浅析UProperty属性说明符

本文就 UProperty是什么?以及UProperty怎么用?做一个简单的总结。

什么是UPROPERTY?

首先看下官方的解释:

 

 

感觉还是比较模糊没看懂有什么用,我们接着往下看

 

要知道UPROPERTY有什么用,我们首先要知道反射(Refection)这个机制。这个机制在Java和C#等语言都是存在的,但是C++语言本身没有,所以UE4才有引入一些功能(例如UPROPERTY)用来实现反射。

 

我们先看看其他语言中对于反射的定义是什么:

反射就是在运行状态中

1.对于任意一个类,都能够知道这个类的所有属性和方法;

2.对于任意一个对象,都能够调用它的任意一个属性和方法;

即可以动态的获取信息以及调用对象的方法称之为反射机制

 

所以在UE4中,当我们使用反射机制,就可以对于一个类(UClass),我们可以获得这个类的所有属性和方法,而对于一个类对象(UObject),我们可以调用它所拥有的方法和属性

反射C++代码是由Unreal Build Tool和Unreal Header Tool产生的,但由于我们本文不深入探讨UE4的反射机制原理,所以到这里我们只要知道反射机制是什么就可以了。

 

怎么使用UPROPERTY?

还是先来看看官方解释:

这里有一个重要的变量叫做属性说明符。他的作用官方说的很清楚,就是用来控制属性以及引擎的部分功能的。

那么有哪些属性说明符呢?我们可以在UE的官方文档中找到,如图红色框部分的就是属性说明符,链接给在图下了。

文档:Unreal Engine UProperty Specifiers | 虚幻引擎5.0文档

现在我们以及知道了UPROPERTY有什么用了,下面会给出几个代码的例子让我来更加清楚的了解它的功能。

 例子全部来自于 All UPROPERTY Specifiers · ben🌱ui (benui.ca),且本文只对其编辑器部分进行翻译说明,想要看原文或者更多功能的可以直接访问这个网站。

 

注:标记不区分大小写,但为了可读性,我建议坚持使用这里的大小写示例。

如果值没有空格,则引号是可选的。例如:someBool=“true”与someboo=“true”相同。同样,为了可读性,我建议仅在字符串类型属性周围使用引号。

 

注:带有Edit的说明符和带有Visible的说明符都是不兼容,二者只能选择一个作为说明符。

 

1.VisibleAnywhere

标记为VisibleAnywhere的属性在地图中蓝图资产的详细信息面板和蓝图实例的详细信息窗格中都可见

指示此属性在所有属性窗口中可见,但无法编辑。此说明符与“编辑”说明符不兼容

效果:

图中右下角的是地图蓝图的资产面板,左边打开的是蓝图实例的详细信息窗格,二者针对后面的一些关键字使用会有些许不同,要注意区分。

 

 

 我们可以看到,在两个窗口里面我们都可以看得见VisibleAnywhereNumber这个变量,但是都是不可编辑的。

还有要注意的点,虽然在详细面板都有这两个变量,但是在蓝图中我们依然是找不到这个变量的。

 

 

 

想要在蓝图中找到这个变量,我们需要使用BlueprintReadOnly这个属性符

就像这样子:

 

 

 效果:

 

 

 此效果都需要使用,后面会再次说明其他关于Blueprint的说明符

2.VisibleDefaultsOnly

"Defaults" 的意思是这个资产就会在蓝图中被显示(例如:你Content中的BP_Cat),但是不会在实例中显示(例如:地图中的Cat)。

我们在使用这个说明符的常用情况是:当你仅仅想把某些资产使用C++来进行编辑和修改,但是不希望使用蓝图的人员对他进行修改。这实际上是一种使属性可见但只读的方法。

例子:

 

 

 注意看红框处,在蓝图中我们可以看到,但是不可写,但是在世界编辑器中,我们连看都看不到VisibleDefault这个值。

 

3.VisibleInstanceOnly

此资产仅仅对于那些存在与地图中的实例的蓝图可见。(不光要创建,还要对蓝图的例子进行实例化,在实例化中的蓝图才会可见这些资产)

这是一个很少使用的可见性说明符,但您可以使用它向Blueprint用户显示在C++中定义的或基于其他属性计算的属性值。

ps:嗯。。很少用的说明符我就不把详细使用发出来了,后续同理,有兴趣的小伙伴自己去上面给的链接进行查看。

 

4.EditAnywhere

EditAnywhere属性的值可以在蓝图的“详细信息”面板和蓝图实例的“详细资料”面板中更改。 
 

 

 效果:

 

 

 我们可以看到,在两个地方都是可以被查询到并且是可更改的。

5.EditInstanceOnly

你可以想要一个资产使用EditinstanceOnly当它在蓝图资产中的默认值没有意义。

例如:一个ATrigger的actor指向一个ADoor实例,并且想告诉这个实例当ATrigger被触发时去进行开门操作。在这个例子里面我们希望TArray<ADoor*>没有意义并且可以被编辑,所以我们要使用EditInstanceOnly。

 

 

6.EditDefaultsOnly

与VisbleDefaultsOnly一样。"Defaults" 的意思是这个资产就会在蓝图中可编辑(例如:你Content中的BP_Cat),但是不会在实例中可编辑(例如:地图中的Cat)。

 

7.ShowOnlyInnerProperties

当您希望避免用户单击以展开结构时非常有用。

例如当它是外部类中的唯一对象时。由结构属性使用。指示内部属性不会显示在可展开结构中,而是提升到一个级别。

使用:

USTRUCT()
struct FCat
{
    GENERATED_BODY()
    UPROPERTY(EditDefaultsOnly)
    FString Name;
    UPROPERTY(EditDefaultsOnly)
    int32 Age;
    UPROPERTY(EditDefaultsOnly)
    FLinearColor Color;
};
// ...
UPROPERTY(EditAnywhere, Category="Cat Without ShowOnlyInnerProperties")
FCat Cat;
UPROPERTY(EditAnywhere, Category="Cat With ShowOnlyInnerProperties", meta=(ShowOnlyInnerProperties))
FCat Cat;

 

 

8.Category="xxxx"

使用 Category, 可以将属性分组到可展开的文件夹中. 管道字符" | "可以用来创建子文件夹. 例如: Category="Character Info | Health" 会为我们创建两个目录:“ Character Info",以及 前者的子目录" Health"

如果在使用BlueprintReadOnly 或者使用 BlueprintReadWrite时同时使用他们,那么你可以在蓝图中通过类别名来找到他们

注意有没有加空格是非常重要的; 如果这又两个资产分别是Category="Parent|Child"和Category="Parent | Child",那么返回结果的时候会有两个结果。

例子1:

 例子2:

例子3:

 

 

9.DisplayName=“xxx”

更改与属性一起使用的文本标签。这在“详细信息”面板和中使用

当存在不需要向用户显示的仅限内部程序员的技术术语时非常有用。

例子:

 

  

 

10.ToolTip="abc"

 当鼠标悬停到资产上时会提示ToolTip上的信息

例子:

剩下的还有一些很少使用的,关于编辑器的设置的就不再赘述了,想要查询都可以到上面的网站。

 

参考链接:

UE4反射机制 - 知乎 (zhihu.com)

All UPROPERTY Specifiers · ben🌱ui (benui.ca)

posted @ 2022-09-01 17:54  CatSevenMillion  阅读(4853)  评论(0编辑  收藏  举报