沿样条线移动的三种方法
第一种方法
- 思路:首先我们建立一个样条线的蓝图,加上spline控件,获取当场景里面的spline控件,所以我们需要拾取spline控件变量,然后获取spline点的位置进行Ai Move To奔跑,我们需要确定什么时候跑结束了,所以需要一个spline点的标识变量,当总spline的点等于标识变量时说明就不需要跑了。
- get location at spline point:在样条点上获取位置
- get number at spline points:获取样条线上所有点数量
- 记得实例化引用了蓝图对象,要给蓝图对象赋予一个参照物
第二种方法
- 思路:在样条线脚本中给样条线添加箭头,利用循环的方法生成箭头,添加一个影响样条线的箭头数量变量,最后将所有生成的箭头放入数组中,判断箭头数组里面的对象是否有效进行AI移动。
- get spline length:获取样条线的总长度
- get location at distance along spline:从该样条线的长度内给定距离,返回该空间中该点放置的位置
- get rotation at distance along spline:从该样条线的长度内给定距离,返回该空间中旋转的旋转
第一步
- 打开样条线脚本,用循环进行添加箭头组件,注意箭头之间的间隔与箭头的数量,我们新建一个影响样条线数量与间隔的变量,然后获取样条线总长度去除以这个间隔变量作为for循环的结束下标,用下标乘以间隔连接到使用获取样条线给定距离的放置位置与旋转函数,然后添加箭头组件与箭头数组
第二步
- 在小白人蓝图中,获取样条线箭头数组的引用使用is valid判断数组中的对象有效性进行AI移动
第三种方法
- 思路:用timeline时间轴的方式去播放奔跑运行沿着样条线奔跑,这种方法也是局限性最大的一种方法,不便于添加其他操作在里面
第一步
-
timeline:创建一个时间轴
-
set play rate:设置时间轴的播放速率
-
lerp:基于alpha进行线性插值
-
SetActorLocationAndRotation:设置actor瞬时移动到指定位置与旋转
-
将时间轴划上两个点,0到1成线性
-
加95的原因是因为模型在场景的位置减了95
第二步
- 此时就要准备修改动画蓝图了,但是因为这时的小白人移动是一种漂移状态没有奔跑动作,所以先在蓝图中添加一个bool变量,来判断小白人是否要执行动画蓝图中的奔跑
- 然后就是去修改小白人的动画蓝图了,在动画蓝图中建议一个是否奔跑的bool变量来进行标识,注意这个是动画蓝图中的变量与小白人中的是否奔跑bool变量不一样注意区分,使用Cast To ThirdPersonCharacter获取到小白人类型,这样我们就可以去调用小白人蓝图里面的是否奔跑bool变量,然后判断是否为真,去让我们新建的动画蓝图里面的标识来决定是否播放奔跑动作
- 然后在动画蓝图中添加一个奔跑状态,用标识来判断是否奔跑
- 三种方法都可以达到这个效果,其中第二种方法比较好用,拓展性也比较高
沿样条线移动拓展
多人奔跑样条线
第一步
- 思路:首先在样条线脚本里面添加一个for循环增添样条线数量,所以我们需要新建一个样条线数量变量,我们获取样条线的右向量,增添样条线,然后使用类似于阵型的居中算法使样条线居中,样条线总量乘以间隔除二乘上返回样条线右向量的单位方向向量,被原先总位置减去即可,然后创建一个结构体数组用来存钱样条线的点。
- get right vector at distance along spline:从该样条线长度内给定距离,返回此处对应的样条线右向量的单位方向向量
- get(a ref):数组的引用
第二步
- 思路:我们新建一个蓝图用来生成实例小白人进行多样条线奔跑,创建一些小白人,添加进数组。然后我们在之前做的沿样条线移动方法选择一种方法,我们选择第二种方法,将函数改为输入目标点数组函数,然后获取到样条线后在多人样条线蓝图进行执行第二种样条线移动方法
步骤一
- add child actor component:新建一个组件并将所有权指定给actor
- set child actor class:设置子actor的类
- get child actor:得到actor实例
- cast to ThirdPersonCharacter:转换为父类,就可以调用父类的方法了
步骤二
- 我们选择第二种方法,将函数改为输入目标点数组函数
- 我们新建一个BP_样条线变量,让我们来获取到跑道,然后进行调用沿样条线奔跑的第二种方法
- 记得要给多人沿样条线奔跑蓝图指定样条线
- 如果奔跑卡顿,要将小白人加速度调大点
第三步
- 思路:既然是要多人奔跑,那么有多少条样条线就有多少排人,每一排对准这每一条样条线奔跑。
步骤一
- 在多人样条线奔跑蓝图中修改一下for循环,有多少个跑道就生成多少的人
- 增加列数,再加一个循环就行
步骤二
-
增加一个小白人的结构体数组,用来存储小白人,方便到时候在样条线跑道上奔跑
-
在多人奔跑样条线蓝图中进行添加小白人到数组中的操作,新建一个小白人结构体数组的变量跟添加样条线结构体数组一样操作
-
最后在多人样条线奔跑的蓝图中添加一个for循环进行调用奔跑方法就行
-
到这里就可以清除掉一开始测试使用的小白人数组了,优化一下
-
运行结果