五、蓝图访问C++变量(UPROPERTY)
一.从C++角度解读蓝图变量
1.创建或者打开一个父类为Actor的蓝图类
本篇用的是我们之前创建的那个BP_Actor的蓝图类


分别将Rendering类别里面的变量拖到蓝图空白处,做对比


引擎既能获取这个变量又能修改这个变量
为什么会出现这样的问题呢?有的变量只能get不能set,有的变量既能get又能set,那我能只能走进基类Actor的C++源码中看一下区别

2.走进父类Actor的C++源码
①猜测问题:为什么有的变量只能get不能set,有的变量既能get又能set?

Ctrl+F搜索Actor Hidden In Game与Editor Billboard Scale变量


仔细观察这两个变量找出自认为能够解释清楚这个问题的理由:有的变量只能get不能set,有的变量既能get又能set?
Actor Hidden In Game:BlueprintReadOnly, Category=Rendering
Editor Billboard Scale:BlueprintReadWrite,Category=Rendering
嘿嘿嘿,恭喜你你猜对了,用你的蹩脚英文解释一下
Actor Hidden In Game:蓝图只读(只能get),类别=Rendering
Editor Billboard Scale:蓝图读写(能get能set),类别=Rendering
二、言归正传解释问题:为什么有的变量只能get不能set,有的变量既能get又能set?
UPROPERTY()宏(后面简称UP宏)是用来修饰UE C++中的变量的;
UPROPERTY()宏搭配变量说明符可以赋予变量极大地灵活性,比如:
控制变量在蓝图中的读写权限;控制变量在蓝图中哪些地方可以被编辑;
控制变量在蓝图中显示的名字;控制变量属于那个类别等等
UE4 C++使用UPROPERTY(属性)说明符赋予属性不同的特性,最常用的包括可见性(Visible),可编辑性(Edit),可读写性(Read/Write).通过使用不同的属性说明符,属性将在蓝图中具有不同的效果。
本篇还是基于上面的Cpp_Actor C++类为测试!
1.可见性(Visible)说明符
①VisibleDefaultsOnly(在蓝图中的默认类可见)
这里的Default表示class defaults

测试代码:

在UE编辑器中为Cpp_Actor C++类派生一个BP_Cpp_Actor的蓝图类


②VisibleInstanceOnly(仅在实例中可见:将蓝图类放置到关卡中即为实例化 )

测试代码:


③VisibleAnywhere(任何地方可见)
VisibleAnywhere=VisibleDefaultsOnly+VisibleInstanceOnly(可以这么简单理解)
测试代码:



可见性(Visible)的完整代码(.h文件)
2.可编辑(Edite)说明符
可见性和可编辑性说明符不能同时使用,同一个属性,只能进行一种说明(可见or可编辑) !!!!!!!
①EditDefaultsOnly(在蓝图的默认类中可编辑)
测试代码:


②EditInstanceOnly(仅在实例可编辑)
测试代码:


③EditAnywhere(任意地方可被编辑)
测试代码:



可编辑性(Edit)的完整代码(.h文件)
3.可读写(ReadWrite)说明符(get set说明符)
读写说明符与可编辑性说明符区别:
读写说明符用于控制属性能否在Variables面板和EventGraph被访问,而可编辑性说明符用来控制属性被配置的场景,读写说明符更多倾向于属性能不能用于参与逻辑编写(读取/写入),而可编辑性说明符则有点像配置文件,用于配置默认值之类.
用最简单的方式可以理解为下图:

①BlueprintReadOnly(蓝图只可读--可get不可set)
测试代码:

我们是在Cpp_Actor的C++类中写的代码,基于这个C++类派生了一个蓝图类BP_Cpp_Actor;这个BluePrintReadOnlyValue变量属于父类,子类也已经继承父类的变量,要想在子类中找到这个变量,那我们必须在子类中显示继承变量(BluePrintReadOnlyValue)



②BlueprintReadWrite(蓝图读写--可get可set)
测试代码:



可读写(ReadWrite)的完整代码(.h文件)
4.Category(类别)
测试代码:


5.meta说明符_属性
meta修饰符用于说明被修饰对象(可以是属性,函数,类,结构体)与虚幻引擎和关卡编辑器等多方面的互动方式.
①DisplayName(显示名字-----别名)
DisplayName不会改变属性的显示名称,而是用于作为搜索的关键词,可以将名字比较长或者拼写比较麻烦的属性的DisplayName设为容易搜索的关键词,提高查找效率.
测试代码:


三、两个小案例有助于理解
1.BlueprintReadOnly
测试代码:(.h文件)

测试结果:

分析代码:
此逻辑为Time_Mix随着Tick增加,其数值被限制在0和Time_Max之间.
由于Time_Max为BlueprintReadOnly,所以在运行状态下,Time_Max的值无法被修改,Time_Mix的数值将始终无法超过Time_Max.
这个例子解释了BlueprintReadOnly的设计思路,即:被修饰的变量的数值不允许在运行状态下(通过代码)被修改.
2.EditInstanceOnly
测试代码:(.h文件)


分析代码:
EditInstanceOnly使每个对象都具备不同的数值,对象可以根据自身专有的数值执行对应的逻辑.
此说明符适合场景中大量存在且对象之间有差异的情况,比如场景中多个公交站牌,每个站牌可以配置唯一的站牌名称.