一、本文达到的目的
本文主要面对初学者,希望能用形象的语言尽可能讲解明白蓝图通信的三种基本方法,包括它们是什么,以及如何使用它们。
二、为什么会有蓝图通信
不同蓝图只能使用在其内部定义的变量和函数等,无法直接使用其他蓝图内部定义的各变量和函数,这一特性是根据C++中类的特性而来,同时也具有类继承等特性(这里不是本文的重点)。如果需要使用某个蓝图内的变量或者函数等(例如我们在动画蓝图中需要获得角色Character蓝图下的移动组件的速度),需要首先获得到角色蓝图或者获得到角色蓝图的移动组件,再获得速度向量。其中获得到角色蓝图或者移动组件这个过程就需要蓝图通信。
形象地说,蓝图通信就好像蓝图A想要获得蓝图B中定义的信息(该信息定义在蓝图B中),需要先联系到蓝图B。
思考一下,现实中我们如何获得与一个人取得联系。如果是一个熟人,通讯录里已经存有他的联系方式,我们直接“指名道姓式”地联系上他;如果是一个陌生人,可以在遇见时留下联系方式;如果是一个名人,可能很多人都在平台上关注了他,所以他一有动态,很多人都能立即接收到最新消息。
三、形象概述三种蓝图通信方法
第一种:直接通信
- 直接通信的第一种:在茫茫人海中能够一眼找到他,所以我能够联系上他。这种方法不够灵活,当我们需要联系上别人时也要逐一在茫茫人海中选择。
- 直接通信的第二种:我今天碰到他了,见到面当然算联系上了,甚至可以留下联系方式以便后日联系。
- 直接通信的第三种:我联系A,可是没有联系方式,但是我知道B跟他很熟,我就联系B,“诶,B,能不能帮我联系上A”。
- 直接通信的第四种:我今天生个孩纸,从出生开始就能够“联系”上他了。
- 直接通信的第五种:突然想联系班主任了,这种独一无二的人一下子就可以get到联系方式;但是如果我想联系另一个班心仪的女生,可能需要先get到另一个班全体学生,再一个个查找是不是那个女生的联系方式。
以上都是一对一的通信,当我们需要给多个人发类似的消息时,这种效率并不高。可以理解,毕竟一对一服务总是更贵一些,而一对多的服务,比如教学,会便宜很多。
第二种:蓝图接口
可以考虑现实中的一个例子:很多城市有一卡通,卡片具有多功能,其中肯定有一个功能是缴费(有很多使用场景:公交车费、水电费等)。这种卡片本身相当于蓝图接口;同样是一个缴费功能,公交系统和水电系统缴费方式肯定不一样,卡片只是给了缴费这个功能框架,具体实现需要在各部门自定义(相当于插入各个蓝图,并且在事件列表进行自定义);最后用户还需选择在具体的场景(公交车、水电服务中心等)使用该卡(相当于玩家使用该卡时,还需调用公交车的引用,不然没办法区分究竟到底给谁缴费)。
蓝图接口同样是一对一通信。使用上述例子可以很容易理解,一个时刻只能缴一个费。
特点:“万能、全能”
第三种:事件派发器(Event Dispatcher)
这个通信方式很容易理解:英伟达(发信者)每次都会在自家开发者盛会上发布新产品(这个盛会相当于派发器,英伟达触发call了这个派发器),社会各界(收信者)都有相应的反应(也就是其他蓝图bind了这个派发器),媒体领域进行的是报道,销售领域上新产品,制造领域进行生产组装等等。
事件派发器是一对多通信。发信者只管发布信息,无需知道收信者信息。
简言之,英伟达只负责发布这个消息,当各领域接收到这个消息后(前提是需要指定关注了这个发布会,不然也获得不到第一手的信息),开始发挥各领域相应不同的职能。
四、使用上述通信的各种情景
晚上吃了点烧烤累了,先挖个坑在这里,视浏览量补更。。