本文就 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:嗯。。很少用的说明符我就不把详细使用发出来了,后续同理,有兴趣的小伙伴自己去上面给的链接进行查看。
效果:

我们可以看到,在两个地方都是可以被查询到并且是可更改的。
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上的信息
例子:


剩下的还有一些很少使用的,关于编辑器的设置的就不再赘述了,想要查询都可以到上面的网站。
参考链接:
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP