原创:事件调度器、函数与TimeLine的小案例教学

  [复制链接]
查看29786 | 回复103 | 2016-11-2 00:29:53 | 显示全部楼层 |阅读模式
本帖最后由 天才小熊猫 于 2016-11-2 00:45 编辑


首先来一张蓝图仙的图来膜拜,当一下这个帖子封面。

今天本猫来给大家讲讲UE4中使用事件调度器,官方文档写的我相信很多小白看了后会一头雾水,同时官方文档里写的方法也不完整,这里我就把事件调度器的两种使用方法来讲一讲。文章最后会附上工程文件,开始之前,我们将会从这一篇教学文章中了解到事件调度器、函数、以及TimeLine的用法。



好了进入正题,在本教学中我们要实现的是:通过角色蓝图(Character)按下F开启和关闭场景中的一个门的开关动画,这个门是由一个Actor蓝图组成,同时使用TimeLine进行门的一个旋转动画,使用事件调度器与函数结合更换这个门的材质。


在开始之前我先简单说下事件调度器,其实用的地方很多,比如你在Actor蓝图写了一个功能,可能无法直接通过按下一个按键去处罚Actor蓝图里的功能,因为要检测玩家,那么这个时候如果直接通过角色蓝图(Character)里添加一个按键去控制那个Actor蓝图里的功能,就不需要进行检测,当然这只是其中一点,,再比如一个事件触发引发了另一个事件,如果一个连贯的事件写在一个蓝图里显然是很不合理的。至于用到其他地方我也就不一一叙述了。


首先我们打开角色蓝图,创建一个PlayDoorAnim的调度器事件:

然后我们在角色蓝图中,添加一个按键“F”,并且Call刚才创建在事件调度器的“PlayDoorAnim”。

这样我们的输入事件就结束了,我来解释下,当按下F后,Call的意思就是呼叫、引到这个名叫“PlayDoorAnim”的调度器。
接下来我们开始制作门的动画,我们新建一个Actor蓝图,我命名为“DoorActor”,并且添加一个Cube,对Cube进行调整,大概调整为一个长方形。

调整后如下

接下来我们打开事件图表,然后添加一个TimeLine,双击,进行如下设置。

首先添加一个Float变量,我这里命名为rotate,然后再右边的区域右键,新建2个时间点,点1设置为time为0,value为0,第二个点设置time为2,value为90,第一个点就是0了,也就是什么都不动,第二个点的time为2的意思是,2秒内旋转完毕,后面的value为90的意思就是旋转角度为90°,连起来的意思就是在2秒的时间内根据坐标轴中心旋转90°。然后我们选中两个时间点,在其中一个时间点上右键,选择auto,让他自动曲线,这个时候时间轴上面有一个Length,我们把他设置为2,因为默认是5,也就是长度为5,但是我们暂时只需要2秒,所以设置为2就可以了其他不管。


接下来我们新建一个“SetRelativeRotation”节点,并且按照如图所连接,将Cube链接到“SetRelativeRotation”节点的Target。

接下来对着New Rotation右键,选择如下图,展开节点。

接下来我们与TimeLine连接。

至此,门的开关动画制作完毕。这里我要说的一点是,由于时间原因本猫没有另外做一个门- -所以直接拿cube当门处理,所以坐标轴就是在中心的,门也是从中心开始转圈的- -所以大家不要在意这些细节。


那么接下来我们接入刚才在角色蓝图里Call的那个事件调度器。


回到这个Actor蓝图的事件表,找到event begin play节点,进行如下链接,从Event Begin Play拖出来线条,输入Cast to FirstPersonCharacter,然后右边继续拖出线条输入PlayDoorAnim,选择Bind Event to PlayDoorAnim,然后进行如下链接,我来说下这个意思,我们的Actor,是独立可以存在任何地方的,为什么要Cast,是因为需要强制转换,因为我们的Actor并不知道这个是由谁控制,所以我们强制转换成我们的玩家,意思就是说是被我们玩家所控制的,在这个项目中就是第一人称的那个玩家。

然后紧接着我们在Bind Event to PlayDoorAnim出来的节点下面红色的Event节点出拖出来一条线,输入Custom,然后添加Add Custom Event节点,并且按照以下方式连接。

这里我把新建出来的自定义事件重命名为“PlayDoorAnim_Event”。


至此,我们的事件调度器就起到了开门的作用,进入游戏,按下F,就会发现场景中的门模型旋转了90°停了下来。


写到这里,其实我们的事件调度器整体已经讲完了,接下来顺便讲一下将事件调度器与函数相结合,在UE4蓝图中,函数使用的应该是非常多的东西了,接下来我们来进行一个函数的结合,函数我们可以简单地理解成一个封装好的模块,可以被我们调用来调用去的,以后的教学内容里我会详细解释下,现在要做的是让我们按下G键的时候,把这个门的材质换了,默认是白色的,我们给他换成一个其他颜色。首先创建一个函数,命名为ChangeMaterial。

然后我们还是按照刚才上面的步骤相同的方法,包括在角色蓝图里创建一个名为ChangeMat的事件调度器,并且用G键Call。

接下来我们添加一个分支,Sequence,进行如下链接。

接下来同样,对着Event拖出一条线,这一次我们输入Create Event,在下拉菜单中,选择我们刚才创建的函数。

这里我就不用说了吧,就是调用我们自己的函数,然后接下来就直接打开刚才的函数,进行如下添加。

好了现在我们进去游戏看看,按下F是开门,然后按下G则是换颜色。


现在我们在继续做一个关门的,关门的,当然你也可以再去角色蓝图创建一个事件调度器,命名为StopDoorAnim,不过那样太麻烦了,这里直接在刚才的actor蓝图里使用布尔变量来判断,如下图。

首先是添加一个布尔变量is move判断是否移动,以及当前移动的状态,然后进行如下链接,第2步要注意,选中拖出来的变量后去右边的面板打对勾,让它成为true,接下来下面的那个TimeLine就是把上面的复制一遍,然后将2个时间点,第一个value改为90,第二个时间点的value改为0,这样就是实现从刚才90°再转回默认的形态。我来解释下这个判断的意思,首先第一次移动,为true,播放第一个动画,再次按下是停止移动后,为false,则进行第二次移动,再次按下,是初始状态没有移动,则循环执行刚才的逻辑。


但是到这里会有一个小问题,逻辑是对的,但是大家在进去场景播放的时候只能播放一次,然后再次按下就无法播放了,原因是在TimeLine上面,这里我又要讲一个知识点,应该大部分人知道,其实这里只需要把2个TimeLine的输入端链接到Play from start就可以了,如下图。

如果选择第一个play,则在播放完里面的一个值后,就会停止,除非你结束的事件链接在TimeLine的reverse端口。


写在最后,其实还有一个问题,我们多次按下F切换,就会发现2个并没有完全播放完毕后就可以切换成另一个动画,这里我们可以使用delay节点再加一个布尔变量判断是否执行完毕,也可以用set time by event,这里抛一个练习题,如果大家有什么好方法可以直接分享出来。


最后这个练习题方法简单而且更容易理解的可以领取积分奖励哟。


本猫暂时把这个问题留给大家是因为后面会涉及到一个与追踪有关的教学内容,里面会有对这个问题的多种解决办法来完成一个追踪的教学内容。


好了今天的小教学内容就写到这里,希望大家也多多发言与分享。

最后附上工程文件,按照惯例回复查看下载地址。
链接:http://pan.baidu.com/s/1slTcMc9 密码:1utc





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
个人博客 : ericsong.org
Eric_Song | 2016-11-2 00:33:46 | 显示全部楼层
沙发自己顶
个人博客 : ericsong.org
回复 支持 反对

使用道具 举报

sgwcg | 2016-11-2 01:46:56 | 显示全部楼层
感谢版主的教程!辛苦了!
回复 支持 反对

使用道具 举报

环卫小工 | 2016-11-2 04:41:44 | 显示全部楼层
佩服一下......
回复

使用道具 举报

group7 | 2016-11-2 07:36:14 | 显示全部楼层
多谢分享
回复

使用道具 举报

chinabeater | 2016-11-2 08:45:26 | 显示全部楼层
小熊猫辛苦了,干货技术帖必须顶
回复 支持 反对

使用道具 举报

powerwb | 2016-11-2 09:07:42 | 显示全部楼层
看看这个先
回复 支持 反对

使用道具 举报

ericth | 2016-11-2 09:13:28 | 显示全部楼层
谢谢分享
回复

使用道具 举报

mbskyshuai | 2016-11-2 09:14:49 | 显示全部楼层
天才小熊猫!!!
回复 支持 反对

使用道具 举报

assn123 | 2016-11-2 09:25:12 | 显示全部楼层
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则