1、新建个Actor,更名为BP_Projectile,添加组件发射物移动组件projectileMovementComponent,
添加个静态网格体球作为子弹:
2、新建个角色用来绘制抛物线,更名为BP_DrawParabola。
我们希望滚动滚轮来控制发射的远近,添加鼠标滚轮轴MouseWheelAxis事件,
创建个变量LaunchDistance用作发射距离,初始值为500。来根据滚轮的值调节发射距离,限制范围在300到2000之间,设置它。
创建2个自定义事件:
通过按键E来控制开启和关闭抛物线。
抛物线可以每帧都绘制,用tick事件能做到,用一个gate来决定是否绘制:
添加一个重要节点按照对象类型预测发射物路径,这个节点根据初始位置和发射的初始速度预测出抛物线路径上点的位置。把检测物体提升为变量数组。
增加一个发射初始位置,添加个静态网格体作为一个发射的起始位置,更名为LaunchPosition,同时对抛出的方向进行调整。
红色坐标轴X方向即为抛射的方向,用这个向量乘以个距离来作为发射速度值:
把发射速度提升为变量,更名为LaunchVelocity方便后面用。
我们需要利用路径上的点来进行绘制样条线,所以我们要先把路径点存储起来,提升为变量。
添加样条组件
给样条线添加样条点,因为目前样条线只有2个点
怎么添加呢?我们需要一个循环遍历数组,并把遍历到的数组中存储的点赋值给样条线上的点:
样条线有了,点也有了,但是场景中样条线是看不见的,我们需要绘制
运行是看不见的
我们来绘制,添加样条网格体组件,圆柱比较适合连接:
并对网格体进行大小缩放和位置的设置:
因为除了最后一个样条点之外每个样条点都得需要添加网格体,所以我们需要一个循环
循环的次数要比数组的长度少一个,因为为了和索引序号对起来,我们需要从0开始,所以循环次数需要减去2:
我们需要把样条点处的位置与切线赋值给设置起始和结束:
蓝图节点获取样条点处的位置与切线中的point index这个索引序号就需要来自于数组成员的序号
蓝图节点连线如下图:
我们先来看下效果,给角色添加摄像机,把小白人自动控制玩家禁用:
把BP_DrawParabola的自动控制玩家打开
运行,按键盘E进行测试:
好吓人啊!需要调整参数。
修改后运行效果:
为了更精细的调整,我们把小白人的事件图表复制到BP_DrawParabola。
运行效果如下:
我们发现一个问题,我们是采用添加样条网格体组件的形式来生成抛物线的,以前绘制的抛物线不会自动消失,需要我们去清除。
首先我们需要把添加的样条网格体组件Spline mesh body component存起来,存相同类型的数据我们可以用数组来存储,先把样条网格体组件提升为变量,更名为SplineMeshComponent,更改类型为数组,再把SET蓝图节点删除:
每生成一个样条网格体组件,我们都把它添加到数组中,
这样我们每一次开启抛物线OpenParabola的时候都把以前的添加的网格体销毁掉并清除数组内容:
运行测试:
以前绘制的抛物线(通过样条网格体组件添加得到的)被清除掉了。同样的下图这部分内容也可以清除掉
就是样条线上的点和按照对象类型预测发射物路径数组也需要清除。
为了方便使用,我们可以把它做成一个没有参数的函数-宏,
连接下输出。
我们关闭抛物线的时候需要清屏。
运行发现仍然是有些bug,需要调节,如下图,或者抛物线长度等等。