蓝图接口
除了最常用的cast to蓝图节点可以实现通信以外,进阶的通信方式就是蓝图接口
- 目的:与多个对象中的特定几个对象进行通信
- 方式:对检测到的对象发送消息
- 消息:发出的消息是接口消息,只有设置了对应接口的对象才会响应,其他的对象发呆
球形检测SphereTraceByChannel
- start:第一个球的球心点
end:下一个球的球心点
radius:每个球体的半径
注意这个检测生成的检测区域是胶囊体形状的,第一个球到第二个球的中间区域是个圆柱
利用接口蓝图实现通信必须要借助检测通道来检测目标对象,从而发送信息
Blueprint interface具体步骤
- 创建一个蓝图接口
内容浏览器中新建一个蓝图接口,命名规则一般跟功能相符合,比如目标是交互式的对象 那就命名BP_interactive 用形容词命名。双击点开命名一个接口函数后关闭,注意视窗里的节点是灰色 因为不同对象会执行不同命令,要到具体对象里去实现,这里只是一个声明。有点多态那味儿了 - 设置目标蓝图类(接收者)的蓝图接口
打开要设置接口的蓝图类中,点开class setting 然后看到interfaces,在这里添加BP_interactive
- 在发信者(玩家的角色)蓝图类中写逻辑
在工作蓝图中(发出消息的蓝图类)右键调出BP_interactive 下的第一个接口函数,出现一个带信封的蓝图节点,啥意思?就是发信息的意思。发信息给谁?球体检测抓住谁就发给谁。
- 回到接受者蓝图中
目标蓝图类中右键找出BP_interactive 下的第一个对应的那个事件,写具体实现即可
- 总结:有点像C++里的多态但是不完全一样,这里不涉及父子类关系。
接口蓝图类就是一个接口类,这个类中只能是声明。然后在目标蓝图类写具体实现,然后调用者里面用检测通道检测目标对象,不管检测到谁,都能在后连接口蓝图中的函数接口,如果检测到的对象包含了这个接口且有具体实现,则通信成功;如果检测到的对象没有设置这个接口,则无作为。
———————————————到此为止简单地实现了一下通信———————————————
—————————————————下面讨论更多一点东西—————————————————
接口蓝图类中添加输入引脚
- 打开接口蓝图BP_interactive,在第一个函数下添加一个输入
- 接口蓝图类中变成这样
- 然后发信者蓝图中效果如下,这样可以实现发送消息的同时给接收者传递一些实际的信息以供使用
- 然后接收者蓝图中对应的事件会增加一个输出引脚,接收来自发信者的传入的信息,注意接收者中的事件依然是事件,与之前没有输入引脚的时候一样的。下面这种情况就会变得不太一样
接口蓝图类中添加输出引脚——事件变成函数
-
添加两个输入引脚,一个输出引脚Output1如下
-
发信者蓝图中的节点(接受者一顿计算后的返回值从Output1出来)(略微有一点难以理解,建议实践)
-
此时,接收者蓝图中的事件不能用了?
这个不同于添加输入引脚。直接添加输出,发信者蓝图会增加输出引脚,但是接收者蓝图中的接口事件会出错,因为事件没有输出引脚只有来自别的事件的输入引脚。 -
此时删除这个事件,重新右键调出,只不过这时候没有事件只有函数了
双击打开后在函数内部进行具体实现的编写,不用连接执行流 -
此时的执行流程是啥样?
-
发信者中做如下操作
-
接收者中的函数体内部,仅仅是对两个输入做个加法后返回
这是接收者中的函数,双击打开后有具体实现,函数摆在蓝图里面就行了 不用连接流程引脚,发出者会调用目标蓝图内的函数,这个函数把结果返回给发出者的节点的输出引脚,然后具体要再执行什么操作,需要在发出者后面来实现。
-
没输出引脚:发出者调用接口,接口调用接收者中的“事件”
-
有输出引脚:发出者调用接口,接口调用接收者中的“函数”,发出者得到其返回值后执行后面逻辑。
-
总结:
事件——在接口蓝图中,未添加输出引脚,注意输入引脚并不影响
函数——在接口蓝图中,添加了输出引脚,注意输入引脚并不影响