UE4制作尸潮爬墙学习笔记

使用UE4制作僵尸世界大战电影尸潮爬墙学习笔记

最近在B站看到一个关于电影僵尸世界大战的尸潮爬墙的效果的制作,观看完之后也自己动手学习制作。现在来做一点新知识的记录。
(附上视频地址:教程地址,感兴趣的可以看看,挺有意思的)

尸潮爬墙

首先对这个特效做一个简单粗暴的介绍(其实讲道理能点进来你肯定知道是啥,不然你点进来干哈?)上图

就大概是这么一个效果,聚堆的爬墙,建议看一下电影僵尸世界大战才比较震撼。

制作

思路

根据这个图我们能看出来这是一个大型踩踏事件,就是一个人踩着下面的人往上爬的一个过程。

实现

  1. 首先创建一个基础的ZombieActor作为基类,这里为了单纯实现效果,没有采用其他的character或者pawn。

  2. 整个效果需要在Tick结点驱动下进行,因为对物体施加力的时候需要使用Tick及各种碰撞检测后的判断

    值得注意的一点是,这次使用的碰撞检测结点是SphereTraceForObjects,这是一个根据ObjectTypes类型来进行检测的结点,和使用channel来判断的有所不同,为了方便且不与其他的物体发生跟多的交互,需要在UE4中左上角的 编辑->引擎->Collision中的Object Channels中添加一个碰撞类型,我创建的是Zombie 反应为Block,也就是图中Object Types的类型。至于碰撞检测的参数,就是单纯一个向前方向的检测。

  3. 碰撞检测之后需要做一系列的判断如下图。在这里插入图片描述
    因为在我制作的场景中只有墙和zombie,所以碰撞之后我只需要对这两种类型进行判断,判断方法就是cast to一下Zombie基类,转换成功就是Zombie,失败就是墙。
    判断完类型后,需要做的就是判断何时进行攀爬了,这里需要两个布尔类型的参数来帮助我们判断。
    CanClimb:设定当前的Zombie是否可以攀爬。以下简称CC
    IsClimbing:表示当前Zombie是否处于正在攀爬的状态。以下简称IC
    总共大致分为以下几个情况:
    a. 没有发生碰撞,则直接施加一个向前方向的力。
    b. 发生碰撞但碰撞的物体不是Zombie类型,则设置CC为True,IC为False,然后继续施加一个向前的力
    c. 发生碰撞且碰撞的物体是Zombie类型,则需要先判断它能否攀爬,若不能,则什么都不做,施加一个向前的力,若能,则需要设定自身的CC为True,并判断碰撞物体是否处于正在攀爬状态,即它的IC是否为True,如果为True,则自身的IC设定为False,并继续施加向前的力;若它的IC为False,则做攀爬的操作。

  4. 力的操作:
    图1
    力的操作上大致分为两种:
    第一种 如上图,即确定的力,图中有两个add force结点,分别是施加向前的力和向上的力的结点。上半部分为向上的力,下半部分为向前的力。根据物理我们可以知道,在理想状态下F=ma,给一个物体施加一个恒力,物体做加速度恒定的匀加速运动,但这不符合我们做Zombie的状态,因为Zombie也是人,需要有一个最大速度,不可能无休止的加速下去,所以,我们需要对Zombie的速度做限定。通过 Get/Set Physics Linear Velocity两个结点来获得和设置物理线性速度,首先通过get来获得速度这一矢量,通过Normalize获得单位向量,即速度的方向;VectorLength来获得速度的大小,然后用Clamp结点对大小做限制,最后通过矢标量相乘获得被限制了的速度矢量,再通过set来设置,就完成了一个力的施加并使其获得速度。

    第二种 则是不确定的力。不过在这之前需要先提一个生成大量数量Zombie的SpawnActor,具体实现会在后面说,这里只是为了方便解释这个力。下图的box是生成Zombie的区域,箭头指的是运动向前的方向。
    在这里插入图片描述
    力的实现蓝图如下图,由尸潮爬墙的图我们可以看出,这个爬墙有一个特点就是,他们是聚堆朝着中心爬的,并不是全部都在线性的向上,所以我们需要给Zombie施加一个向中心的力。而这个向中心的力由于我们是生成的Zombie,所以每个Zombie的位置都不一样,所以需要让他们向中心的方向是不确定的。那么我们就需要有一个参照物来让这个力确定下来。大致分为以下几个步骤:
    a. 既然以Box为参照,那首先需要找到Zombie对于Box的位置,因为在整个世界中两个物体的向量原点并不是Box的向量位置,所以需要将Zombie的向量减去Box的向量,来获得以Box为原点的Zombie的相对向量位置。
    b. 获得相对位置之后,因为我将Box的X轴正方向作为中心,所以需要判断Zombie在X轴的左右,方法是将相对向量投影到Y轴,然后将得到的向量单位化成单位向量,再和Box的右方向向量进行点乘,因为都是单位向量所以得到的值就是两个向量角度的cos值,又因为都在同轴,所以角度非0即180,所以得到的值非1即-1,以此来判断Zombie的位置。
    c.判断完位置之后,就可以进行力的施加,不过由于Zombie在左我需要让它向右,在右需要向左,所以需要将运动的方向再乘以-1,便是我们施加力的正确方向。
    在这里插入图片描述

  5. 生成Zombie的Box。这个东西没有什么太大的难度,新的知识就是一个Set Timer By Event结点,就是能绑定一个事件,隔段时间就能运行这个事件。大致的思路就是在整个Box区域内固定时间间隔随机位置生成固定数量的Zombie。需要考虑的几点就是在生成的时候跟地面的碰撞检测,不能出现模型穿模(当然了,开启了物理模拟应该也不会的吧),然后就是在生成了之后需要调用一下每个Zombie设置自身SpawnActor的参数。总体来说没什么难度。
    在这里插入图片描述
    在这里插入图片描述

总结

整体做下来,感觉收获大的地方应该在于Zombie的设计上,实现上需要考虑的情况比较多。

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值