思路:简单化,比如让一个物体沿着一条直线运动,比如双开移动门,是不是控制两个门分别往左边和右边移动,也就是通过addTime进行设置,每一帧改变Location就可以了。
转化思路:轨道是不规则的样条曲线,不仅仅通过addTime的每一帧改变物体的Localtion还要改变物体的旋转Rotation,也就是每一帧的位置和旋转都是样条曲线的,也就是我们需要传入一个样条曲线的实例,所以定义一个变量,为此蓝图样条曲线的类型,把变量暴露出去,在场景中选中运动的物体,找到该物体的细节面板,选择对应的样条曲线实例赋值给变量,这样我们就能拿到样条曲线,通过样条曲线相关函数通过【Get Location at Distance Along Spline】和【Get Rotation at Distance Along Spline】获取该样条曲线当前点的位置和旋转
- 创建Track蓝图类(轨道)并添加一个Spline样条曲线
- 创建TrackCar(移动车)蓝图类并添加一个Mesh(车,方块都可以)
- 编写TrackCar的蓝图逻辑
- 将TrackCar扔到场景中并在细节面板中拾取对应轨道实例
一、创建Track蓝图类(轨道)并添加一个Spline样条曲线
目前我们只是加一个样条曲线,对样条曲线不做任何修改,如果想要改成火车轨道的话,需要添加轨道模型和蓝图逻辑,这里我们先不复杂话,先让一个mesh沿着曲线运动
二、创建TrackCar(移动车)蓝图类并添加一个Mesh(车,方块都可以)
我这里随便添加了一个静态网格体(mesh),如果有其他模型,比如小火车之类的可以加进去
三、编写TrackCar的蓝图逻辑
3.1、设置自定义事件MoveCar
把轨道运动自定义一个事件,增加一个变量为ActiveCar为Boolean类型,然后暴露出去,判断是否将其在轨道上运动,方便后续我们扩展
3.2、添加时间轴(循环)通过每一帧设置TrackCar的位置
通过addTime添加时间轴命名为CarMover来对每一帧得模型改变其位置和旋转角度
选中loop才能实现循环运动
新增一个变量为TrackRef变量类型为Track类型,因为我们在场景中要关联指定的轨道,来获取该轨道的各种信息
解释lerp函数,A-B(任意数组),不管是什么都看作为0-1的过程,Alpha表示当前百分比(输入的值0-1之间的树),Return Value返回当前时间的A-B的实际值
通过刚才的变量Tarcak Ref获取到里边的Spline,通过函数【Get Spline Length】获取轨道长度,所以我们这个时候给Lerp的值A为0表示起点,B的值为轨道长度作为终点。时间轴从0-1秒的每一帧的小数作为比例,也就是我们可以拿到每一帧轨道点的距离。
获取距离干什么?通过spline的相关函数传入【轨道对象】和【轨道距离】就能通过【Get Location at Distance Along Spline】获取轨道上当前帧的位置,通过【Get Rotation at Distance Along Spline】获取轨道当前帧的视角
所以我们获取距离distance就是这个用途
3.3、设置模型运动完轨道的时间
设置时间速率,来控制运动的速度,刚开始我的想法是直接控制时间长度不就可以了吗?但是我们的Lerp中的Alpha是输入0-1的值,而且时间不好更改,想要更灵活通过设置一个变量我们就能对于不同的轨道设置不同的速度,想到就很爽。
增加一个变量Duration为浮点型,作为运动完这条轨道的时间,我们再增加一个变量KartStartOffset浮点型作为我们开始的时间,比如两个火车运动,我错开时间是不是就可以实现两火车错峰出行(将这两个变量暴露出去)
通过函数Set Play Rate(记得是时间轴类型,因为有好多种类型,对应的对象不一样)
传入CarMover时间轴对象,时间就是0-1要是想要改变长度就是改变速率,放速率利用除法1/时间,然后设置事件连接上即可
创建一个轨道实例
创建一个Car实例
然后运行程序就可以运动了,这里我就不放动图了
【扩展】:
当然轨道现在只是一条去曲线,但是如果更改蓝图逻辑让其附带上mesh那么我门就可以实现一个真实的轨道,我下边有个例子不过不是轨道而是模仿的管道的流向