UE4学习心得:蓝图间信息通信的几种方法
蓝图间通信是一个复杂关卡能否正常运行的关键,笔者在这里提供几种蓝图类之间的信息交互方法,希望能对读者有所帮助。
1.类引用
这是最直接的一种蓝图类之间的信息交互方式。首先在Editor中创建2个Actor蓝图类,分别命名为TargetActor和ControllerActor,双击打开TargetActor编辑器,将组件窗口中的DefaultSceneRoot替换成Cube,并设置成Movable,编译后保存退出,然后打开ControllerActor,将组件窗口中的DefaultSceneRoot替换成Sphere,新建变量Actor,类型为Actor引用,将其设为公共变量。返回关卡编辑器中,将2个Actor拖放进场景中
点击ControllerActor,在Details面板中可以看到Default选项将Actor设为TargetActor或者点击右侧的针状标记,然后选中场景中的TargetActor
返回ControllerActor编辑器中,添加一个Event Tick事件
运行关卡后可以看到TargetActor在不断地上升,说明在ControllerActor蓝图类中的逻辑成功地运行了,两个蓝图类之间完成了信息交互。
2.Get All Actors of Class
Get All Actors of Class是一种整体上的调用,首先在TargetActor的事件图表中封装一个函数命名为AddOffset
函数逻辑如下所示,是一个简单的物体移动操作。
然后在关卡蓝图中添加一个F按键驱动事件
可以看到Get All Actors of Class得到的输出结果是一个数组,它包含了在关卡场景中所有存在的同种类蓝图。运行关卡后按F键测试时可以看到TargetActor垂直向上移动,如果在场景中拖放2个或者更多个TargetActor,可以看到所有的Actor都会垂直向上移动,如果只想让其中的某个或某几个Actor进行这种移动,可以对输出数组进行选择。
3.接口调用
UE4的接口调用技术有点简单粗暴,而且主要体现在主蓝图对子蓝图的信息通信。
在内容浏览器中添加一个蓝图接口,命名为TestInterface
双击打开接口,直接使用其创建时自带的一个接口函数,将其重命名为TestAddOffset
(这里相当于接口的函数定义),新增一个函数输入命名为Offset,类型为Vector。
在关卡蓝图中将ClassSettings的Interfaces添加刚才创建的TestInterface
添加F按键驱动事件
在Get All Actors with Interface中将Interface设置为TestInterface,然后查找TestAddOffset函数(注意这里是调用Message,相当于发送一个调用接口中特定函数的请求),这里随意设置一个Offset值作为物体的移动距离。
返回TargetActor的蓝图中进行同样的设置,然后调用Event TestAddOffset(这里相当于接口的函数实现),进行逻辑编写
完成后运行关卡,可以发现F键运行正常。
读者可以发现一个现象,TestAddOffset事件只可以在子蓝图(像TargetActor,ControllerActor,甚至控制器PlayerController)中调用,但就是无法在关卡蓝图中调用,而调用接口函数的信息方法Get All Actors with Interface则可以在任意蓝图中使用(前提是蓝图中的ClassSettings中添加了该接口),用一个形象化的比喻就像上级领导或同事之间可以命令其去帮你办事,但下属是没有权利命令上级领导的。
4.事件调度
事件调度是一个比较简便的方法,主要在于区分调度者和被调度者。
一般在调度者蓝图中定义事件调度器。打开ControllerActor蓝图编辑器,添加一个事件调度,命名为OffsetTest
为了便于理解事件调度器是如何工作的,这里给Offset添加一个Vector输入,命名为NewOffset
在事件图表中添加1按键驱动,将OffsetTest拖入事件图表中,选择call选项,并设置NewOffset的值,之后连线编译。
这里的1按键驱动在常规情况下是不会被响应的,所以需要额外的操作,让控制器在事件开始时给予这个蓝图允许输入权限就行了
接下来进入TargetActor蓝图中,进行事件的绑定
这里可以理解为在事件开始时通过全局搜索到Offset事件调度器的绑定选项,然后从Event节点绑定一个自定义事件,该事件的输出就是事件调度器在ControllerActor事件图表里定义的输出内容,之后进行物体的移动,整个逻辑就完成了。
运行关卡后按1键可以看到物体正常移动了。
以上就是笔者所知道的所有蓝图通信的方法了,欢迎读者进行完善补充!
UE4学习心得:蓝图间信息通信的几种方法的更多相关文章
- vue-learning:31 - component - 组件间通信的6种方法
vue组件间通信的6种方法 父子组件通信 prop / $emit 嵌套组件 $attrs / $liteners 后代组件通信 provide / inject 组件实例引用 $root / $pa ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- c#中实现串口通信的几种方法
c#中实现串口通信的几种方法 通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册 ...
- Nginx学习——Nginx进程间的通信
nginx进程间的通信 进程间消息传递 共享内存 共享内存还是Linux下提供的最主要的进程间通信方式,它通过mmap和shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者 ...
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
- Java 多线程(七) 线程间的通信——wait及notify方法
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- 简单看看ThreadPool的源码以及从中看出线程间传值的另一种方法
这几天太忙没时间写博客,今天回家就简单的看了下ThreadPool的源码,发现有一个好玩的东西,叫做”执行上下文“,拽名叫做:”ExecutionContext“. 一:ThreadPool的大概流程 ...
- laravel5.5框架中视图间如何共享数据?视图间共享数据的两种方法
laravel框架中视图间共享数据有两种,一种是用视图门面share()方法实现,另一种是用视图门面composer() 方法实现,那么,两种方法的实现究竟是怎样的呢?让我们来看一看接下来的文章内容. ...
- Vue中组件通信的几种方法(Vue3的7种和Vue2的12种组件通信)
Vue3组件通信方式: props $emit expose / ref $attrs v-model provide / inject Vuex 使用方法: props 用 props 传数据给子组 ...
随机推荐
- gitlab6 配置的几个问题说明
gitlab6 配置的几个问题说明 按照gitlab的网站的详细步骤,终于把gitlab 6.1 stable安装到2台虚拟机上了.由于gitlab6运行于虚拟机上,所以配置这个虚拟机的hostnam ...
- 理解WebKit和Chromium: Android 4.4 上的Chromium WebView
转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 相信读者已经注意到了,在最新的Android 4.4 Kitkat版本中,原本基于Android Web ...
- Ajax 初步学习总结
Ajax是什么 Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对现有技术的一种新的应用,不是一 ...
- python的w+到底是什么
python 文件处理的打开方式有很多种, os.mknod("test.txt") 创建空文件 fp = open("test.txt",w) 直接打开一个文 ...
- [转].NET程序破解仅需三步
近期开发公司商城,为了简化开发用了V5Shop网店程序.本来预计一个月完工,哪知道出现一堆问题大大增加了我的工作量(早知道还不如全部自己写了). 破V5Shop真不地道,说是免费的,结果程序一大堆问题 ...
- kettle简介(整体架构,运行方式,使用方法)
项目负责人Matt的说法:把各种数据放到一个壶里,然后呢,以一种你希望的格式流出.呵呵,外国人都很有联想力.看了提供的文档,然后对发布程序的简单试用后,可以很清楚得看到Kettle的四大块: Chef ...
- 标准会话管理器——StandardManager
用于保存状态的会话对象已经有了,现在就需要一个管理器来管理所有会话,例如会话id生成.根据会话id找出对应的会话.对于过期的会话进行销毁等等操作.用一句话描述标准会话管理器:提供一个专门管理某个web ...
- Leetcode_48_Rotate Image
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/44216867 You are given an n x n ...
- 重新初始化VS2010
开始->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Stdio命令提示(2010) 这时会 ...
- android bitmap压缩几种色彩详解
android中的大图片一般都要经过压缩才显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节. 打开Android.graph ...