欢迎光临散文网 会员登陆 & 注册

五、蓝图访问C++变量(UPROPERTY)

2022-11-24 18:48 作者:爱玩UE5的小哥哥  | 我要投稿

一.从C++角度解读蓝图变量

1.创建或者打开一个父类为Actor的蓝图类

本篇用的是我们之前创建的那个BP_Actor的蓝图类

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

引擎只允许获取这个变量而不能修改这个变量

引擎既能获取这个变量又能修改这个变量

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

Parent Class:父类

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使每个对象都具备不同的数值,对象可以根据自身专有的数值执行对应的逻辑.

此说明符适合场景中大量存在且对象之间有差异的情况,比如场景中多个公交站牌,每个站牌可以配置唯一的站牌名称.

五、蓝图访问C++变量(UPROPERTY)的评论 (共 条)

分享到微博请遵守国家法律