本文主要分享如何在UE4中实现游戏中近战攻击判定的方法之一——“射线检测”。
首先说一下实现逻辑:
1.我们将在武器上设置几个射线发射点
2.我们攻击时,游戏中的每一帧都会保存射线发射点在武器上的位置
3、射线的发射方向是当前帧的射线发射点的位置到我们在上一帧保存的射线发射点的位置
4. 射线检测到物体,然后造成伤害。
*大体原理是这样的游戏评测,具体需要注意的细节在下面慢慢讲解。
第 1 步 - 将射线的发射点插槽添加到武器:
1.首先在UE4中打开我们要使用的武器的模型,点击Create Socket按钮,添加几个socket,
2. 然后我们将 Socket 移动到我们想要发射光线的位置。
3.然后在我们要安装武器的角色的骨架上添加一个武器插槽,在Preview上选择我们想要的武器进行预览,预览也可以进行动画预览演示。
4.然后将武器添加到我们的角色蓝图中。
这样,我们角色的初始设置(给武器添加Socket作为射线发射点,给角色添加武器)就完成了!
Step2 - 给敌人添加一个可以被攻击的接口
1.创建一个接口,这个接口类的表示可以被攻击
2.给我们的BP_Enemy添加一个接口
3.然后实现这个功能。如果检测到攻击,则调用该接口函数表示敌人被攻击。
Step3 - 制作 HitHandlerComponent(攻击判定组件):
制作组件的主要目的是为了程序的可重用性。只要写一个组件,就可以添加不同的角色,添加攻击判断功能。
在此之前,我们先梳理一下我们要实现的射线检测功能的需求,即在玩家攻击时启动射线检测来检测物体。这里我用的是刀,所以应该是刀下摆时的动作顺序。帧我们进行光线检测,所以大概逻辑是
1.判断是否是下刀的瞬间(这个会在后面的动画蒙太奇中处理)
2.如果是,我们将开启射线检测,如果不是,将其关闭
3、射线的发射方向是从当前武器上Socket节点的位置到上一帧Socket节点的位置
4.射线检测到敌人,对敌人调用GetHit函数
逻辑是这样的,具体实现和一些细节会在下面介绍
1. 创建组件
2、为Component创建一个MeshComponent来存放武器;
创建一个bool变量TraceOpen,表示是否开启光线检测;
创建一个Name数组来存储武器上所有插槽的名称;
创建一个 SocketName 和 Location 的 Map 来存储每个 Socket 对应的位置。
自定义一个初始化 Component 中数据的事件。
3、创建两个自定义事件EnableTrace和DisableTrace,分别在攻击检测开始和攻击检测结束时调用。
4. 创建Trace事件,该事件是从武器上所有Socket的当前位置发射到上一帧武器上的Socket位置的逻辑。使用的 Trace 是 MultiLineTrace
5. 继续完成 Trace 事件。这里的主要工作是检测所有被射线击中的Actor,判断这个Actor是否有CanBeDamaged接口。如果是这样,则意味着它可能会损坏。然后我们需要确定它是否已经引起。一旦伤害已经造成,我们不需要再次伤害造成伤害的Actor,所以这里我们要创建另一个Actor数组来保存我们已经造成伤害的敌人,我们可以在射线检测中忽略这些伤害前。演员。那么我们每次攻击一开始都要清空这个阵,然后顺便把自己加进去游戏图片,防止打到自己。最后,我们需要在打开 Trace 时设置框架武器节点的位置。
6、对于攻击的每一帧,我们要保存当前帧的Socket位置作为下一帧光线的终点,所以创建一个事件UpdateTrace来更新SocketLocation。
7、HitHandlerComponent最后一步,开启Trace时,检测每一帧,每帧结束后UpdateTrace
Step4 - 在动画中打开和关闭光线:
(有关如何使用蒙太奇的详细信息,请参阅其他博客或教学视频)
这一步的目的是让光线检测在动作挥刀的帧序列中准确地进行光线检测。使用动画通知(Animation Nofity)的具体步骤如下:
1、创建一个蓝图类,类为AnimNotifyStateunity 近战攻击判定,命名为ANS_Hit,动画通知有两种,一种是执行一次的AnimNotify,一种是可以连续执行的AnimNofityState。这里我们使用一个动画序列,所以我们使用第二个。
2.创建一个攻击动画蒙太奇,找到我们攻击和刷刀的那一帧,右键添加AnimNotifyState找到我们之前创建的ANS_Hit并添加。
3. 添加后,拖动调整范围。范围是攻击和挥刀的动画,所以即使动画通知被处理了,然后去ANS_Hit类写这个通知和我们要通知的内容。
4.打开ANS_Hit,我们这里重载了4个函数。这就是所有 AnimNotifyState 所拥有的。我们主要使用 Received Notify Begin 和 Received Notify End。这两个重载函数将分别在动画通知序列中。该段落的开头和结尾被称为。
5.分别写这两个函数,获取Owner然后根据Component类获取我们之前写的HitHandlerComponent,Begin时调用EnableTrace,End时调用DisableTrace。
第 5 步 - 调试:
1. 为我们的玩家角色添加 HitHandlerComponent
2.启动游戏时初始化,调用HitHandlerComponent的Init Weapon Socket事件
3.设置敌人的碰撞体,将Visibility设置为Overlap,这样光线可以检测到敌人。
4. 使光线可见
然后这是最终结果unity 近战攻击判定,结束
我在写博客和自己做的过程中也犯了一些小错误。将要更改的部分可能不会在文中提及。如果您发现错误,请原谅我。本文主要分享射线检测的思路和制作方法。