文章目录
- 总览描述
- 批次阅览
- 1.1 Basic communication with a target blueprint
- 1.2 Basic communication via actor casting
- 1.3 Blueprint communication via actor casting to child Blueprint
- 1.4 Communicating with all actors of a specific class
- 概念总结
- 致谢:
总览描述
打开关卡后,引入眼帘的就是针对关卡的总体性文字描述,这里翻译一下:
这个地图提供蓝图之间通信的各种方式的案例!主要包括:通过Cast直接通信、使用事件分发器、通过蓝图接口
批次阅览
1.1 Basic communication with a target blueprint
通过一个目标蓝图通信
此示例具有一个按钮蓝图,它通过自定义事件来触发一个灯蓝图的开关。播放时靠近按钮从而激活它。
关键概念:
- Custom Event
- Time Line
- Material Instance
蓝图分析:
整体上基本包括两个蓝图:按钮蓝图和灯光蓝图,咱们分别看一下
按钮蓝图
- Actor的Component结构
它就是一个根组件带了两个组件,一个静态网格体组件,一个触发盒子组件。
- 构造函数
创建一个材质实例,提升为变量,用它设置了静态网格体的材质。
- 事件图表
主要的逻辑就是重写了触发盒子的重叠事件,设置了材质实例的State参数,大概率是用于设置按钮的不同颜色,有一个TargetLight的Actor对象引用,分别调用开灯和关灯!
那么,这个TargetLight的Actor引用,怎么来的呢?其实就是设为Public变量,然后在关卡给它指定为灯光蓝图,咱们确认一下:
小眼睛是打开的,没有问题。咱们进入关卡看看
点击上面右侧的箭头后,确实也定位到了场景的灯光蓝图,如下所示:
灯光蓝图
-
Actor的Component结构
我们看到,它就是:静态网格体组件作为根组件,下面挂了一个点光源子组件
-
构造脚本
它基本上就是创建两个材质实例,提升为变量,设置给了灯的静态网格体组件!
-
事件图表
基本上就是创建了一个Custom Event自定义事件,有一个输入bool变量。它为true的时候,它通过TimeLine时间轴,是的灯光缓缓的亮灯;它为false的时候,设置灯光颜色为黑色,我们进UpdateLightColor函数,简单瞅一眼!
基本上就是两块逻辑:1、设置材质实例的EmissiveColor参数值 2、设置点光源组件的灯光颜色和强度
这里简单解释一下:
1、材质实例就是材质的一个实例。通过在材质中添加参数输入,就可以在它的材质实例进行动态设置修改这个参数,达到动态、灵活的目的!
2、时间轴节点就是一个特殊的节点,它允许用户在其中创建关键一段时间的参数的关键帧,从而实现平滑的过渡,上述就是通过设置颜色的Alpha通道,从而调整灯光颜色的缓慢过渡!
1.2 Basic communication via actor casting
通过actor的cast转换通信
翻译:在这个例子中,一个灯泡蓝图通过连接一个电池来触发开与关。灯泡使用一个重叠事件来检测电池蓝图的接触,并相应的设置开/关。
关键概念:
- Cast
- Lerp
蓝图分析:
图中显示主要包括3个Actor,按钮蓝图、灯泡蓝图、电池蓝图,咱们分别看一下:
(1)按钮蓝图
-
组件结构
跟上节一样,根组件挂两个组件:StaticMeshComponent和Trigger collision
-
构造脚本
同上节,不解释,创建一个材质实例,并提升为变量
-
事件图表
这个也和上节差不多,触发盒子重叠的逻辑有点不一样,它除了设置材质的State参数值,这边它设置了一个电池蓝图引用的Move Up/Down函数,控制电池的上下!进入关卡蓝图确认一下:
确实是这个样子的,直接引用了电池的蓝图!
(2)电池蓝图
-
组件结构
根组件挂了一个电池的静态网格体组件,然后它又带了一个立方体的触发盒子 -
构造脚本
设置了静态网格体组件的模型
-
事件图表
它自定义了一个Move up/down的事件,它通过时间轴和插值结点设置了静态网格体组件Battery的位置和旋转,不难猜测,其实就是控制电池的上下移动!
Lerp(Vector) 结点是向量的插值结点,通过定义Alpha(一般是0-1),从而获取一个向量A-向量B之间的一个过渡值。
Alpha为0时,结果为A;Alpha为1时,结果为B;Alpha:0-1时,结果就是A*(1-Aplha)+ B * Aplha。
(3)灯泡蓝图
-
组件结构
根组件为静态网格体组件,它有两个子组件:触发盒子组件、点光源组件
-
构造脚本
也是类似,创建两个材质实例并提升变量
-
事件图表
主要有好几个逻辑,一个一个看:
首先是初始化:
主要逻辑就是:通过获取触发盒子的所有重叠Actor,依次遍历,通过Cast强制转换结点判断,是不是电池,如果是电池蓝图和自己重叠了,就获取电池的电量值加到本身自己的电量供给的变量,然后根据电量供给是否>=0,决定灯泡触发开关。
然后是触发盒子重叠事件:
主要逻辑就是:通过Cast强制转换结点判断,是不是电池,如果是电池蓝图和自己重叠了,就获取电池的电量值加到本身自己的电量供给的变量,然后根据电量供给是否>=0,决定灯泡触发开关。
最后是Toggle On/Off 的自定义事件:
逻辑和之前的前面类似,主要就是通过变量Electicity Suppled的变量值进行调整灯光颜色的Alpha值,从而更改灯光的颜色!
1.3 Blueprint communication via actor casting to child Blueprint
通过actor的cast转换为子蓝图通信
翻译一下: 这些灯泡蓝图通过连接不同类型的电池进行开关。每一种电池都是从同一个父类蓝图派生,但是有不同的电量值来影响灯泡的亮度。
关键概念:
- Child Blueprint Class
- derived
蓝图分析:
本次的图中,我们看到3个按钮蓝图,三个电池蓝图,三个灯泡。其中3个按钮、3个灯泡都同上节一样的,咱们不多赘述!重点关注电池蓝图同上节的区别。
关卡中选中任意电池,按Ctrl + B跳转到内容浏览器,发现了三个电池的蓝图,其中两个后缀为Child,就是派生父类的子蓝图类!
咱们确认一下:
1、不带Child后缀
2、带Child后缀
我们发现确实父类变了,那么正常情况下,如何派生父类呢?其实很简单,右键父类蓝图,然后有一个选项创建子蓝图类,如下图:
我们进入父类蓝图观察:
原来,他通过暴露电池的静态网格体模型参数,以及电量供给参数,从而实现子蓝图类,可以配置自己专属的模型样式和电量,从而实现不同灯泡的发光亮度!那么为什么呢?其实本质上就是子蓝图类Cast为父蓝图类,是可以转换成功的!
多态就是面向对象编程的三大概念:封装、继承、多态。
从蓝图派生子蓝图类,本质上就是继承的过程,它会拥有父类蓝图的所有属性和方法。
这里的父类和子类,有点类似于动物和狗的关系,狗从动物派生而来,狗必定是一种动物!
所以派生类能够Cast父类成功!希望大家多多理解着里面的概念!
1.4 Communicating with all actors of a specific class
和所有一种明确类型的actor通信
**翻译:**一个按钮控制一类所有灯泡的开和关。这个按钮蓝图找到所有灯泡类的实例,然后对其中每一个调用Togglelight事件!
关键概念:
- Get All Actors Of Class
- For Each Loop
- Array
蓝图分析:
就按钮蓝图和灯泡蓝图嘛,灯泡咱们不看了,重点关注按钮蓝图获取所有同一类Actor的实例。
-
组件结构
不多赘述
-
事件图表
我们发现通过Get All Of Class这个蓝图结点,设置咱们关注的类,就可以获得一个Actor的Array,也就是数组,表示很多个Actor,通过遍历这个数组,将他们Cast强转,进行Toggle Light事件调用完成批量开关灯。
概念总结
1、Custom Event
2、Time Line
3、Material Instance
4、Cast
5、Lerp
6、Child Blueprint
7、Get All Actors Of Class
8、ForEachLoop
9、Array
因为篇幅原因,Blueprint_Communication这个关卡还有一半就放下一篇啦!
致谢:
今天的学习就到此为止啦,喜欢的小伙伴点点关注+赞哦!有问题及时留言!感谢大家Thanks♪(・ω・)ノ!我是火火,火一般的男人!