373玩 手游攻略 新游动态 如何用UE5做一款大逃杀游戏 05:子弹开火逻辑

如何用UE5做一款大逃杀游戏 05:子弹开火逻辑

时间:2024-06-14 10:16:31 来源: 浏览:95



本期教程我们要对当前的摄像机进行后期处理,以获取所需的效果。首先,我们需要设置焦距。这个值需要在后期处理中进行调整。我们在右侧的详细信息中勾选设置该值。如果直接调整,可能会出现太多的选项。因此,我们需要查找正确的值。将焦距设置为真实距离,并将其作为引脚输入到当前的节点中。这样,我们就能得到所需的值。其他参数无需处理,如果没有出现所需的值,则使用默认值。

如果玩家未按下键盘上的q和e键,则x值为零,这意味着不会出现模糊效果。如果超出值不是0、1或-1,说明玩家按下了键盘上的键,摄像机应该模糊。我们将其设置为5,这样就会产生模糊效果,非常容易理解。保存并编译。在游戏中测试,按下右键进行瞄准,然后按下e键,会出现模糊效果。松开q或e键后,模糊效果消失。这非常容易理解,我们成功为摄像机添加了模糊效果。还有一个细节要注意,即瞄准镜的缩放。当放大到最大或缩小到最小时,仍然按住按键时,仍会出现模糊效果。但当镜头无法再放大或缩小时,模糊效果应该消失。因此,我们需要确保视野值在最大或最小值时不模糊。根据这些条件,我们可以调整模糊效果的行为,以确保其准确性。

因此,我们将字体大小设置为16,稍微小一点。默认值为1,对齐方式设为向右对齐,靠在瞄准镜的右边,这样就很容易理解了。然后,我们将字体的形式调整得稍微细一点,不要太粗。接下来,为了突出显示,我们给它添加了阴影,阴影的大小设为0.5。这样就能使文本在背景中显得更突出,不至于与背景融合在一起。然后,我们将文本组件重新命名为“Scope Some Value Text”。接下来,我们需要将玩家在PC中的缩放倍率值调用到UI中。我们通过创建一个绑定实现这一目标。

首先,我们获取玩家控制器,并将其转换为“Sleppyer Controller”,然后从中获取摄像机视野的值。这个值需要进行一些数学转换,将560的值转换为28。我们将这个转换过程放入UI中的绑定。注意,我们要除以0.10或0.03而不是直接除以10,这是因为我们想要在数值显示中保留更多的小数,以增加数值的视觉丰富度。然后,玩家会感觉更加满意。这应该是大家都能理解的。比如说,如果我们只是简单地除以十,我们可以连接到这里来看一下保存并编译,好了,开始游戏。如果只是除以十,那么它可以被整除。你可以看到右边是一个二对吧。当我放大时,就是三点几,四点几在那边跳。哎,这个内容太少了。但如果除以10.0003,这样的话它就不会被整除,然后小数点后面就会多出一些数字。看一下右键,那个二的话肯定只能整出十点几。

看起来好像还是可以被整除。这可能是因为这个小数被限定了一下。看一下,除以10.003还是能够被整除。这有点尴尬了。但如果除以10.001,多了一个零点零零零三,小数点后面就会多出一些数字。如果小数点后面的数字太小,那么就会直接四舍五入。好,这样的话你可以看到我们这个数值就多了。这样内容就更丰富了。其实这只是为了视觉上更好看一点,其实无所谓的。这只是一个细节问题,0.003,小数点后面的后三位,这样的话它就会多出几位数字,内容就丰富了一点,这只是一个细节而已。

绑定好之后,我们就有一个放大缩小的倍率在那里了,可以看到这个效果。这样的话,玩家就能够知道我当前放大的倍率是多少倍,放到这个效果是多少倍。但是这里,这时候的话还有一个问题。还有一个问题是什么问题呢?由于有了这个小数,所以我缩小到两倍镜的时候,它是1.99999,就有点尴尬,然后当我放大到这个八倍镜的时候,它是7.498,其实应该是7.5,但其实这时候应该是一个八倍镜,对不对?所以因此的话我们需要把这个数值呢在四舍五入一下,在两个极致的地方,一个是1.999变成二,还有一个呢是让我们的这个7.498变成八,就是这么一个数值的规划。

中间的话无所谓,让它小数在那边就可以了,中间无所谓。所以因此在这边我们对当前的值再进行判定好再进行判定,判断当前的这个值,首先第一个是否小于二,如果小于二,就直接显示二这个数值,那么如果不小于二,如果不小于二,那直接显示我们当前的这个值链接过来,这是一个,那么另外一个就是我们当前的这个值,它是否是大于这个7.49的,也就是说当你这个值接近7.5的时候,就直接让它显示八倍镜。那么所以这边这个值是否大于7.49的好,如果大于7.49的,理解到这边我们直接显示八点啊,刚才应该是二点啊,抱歉,二点给他一个小数吧。那么如果他没有这个大于呃7.49,那么就是正常值,直接显示我们当前的这个值。好,编译保存,我们来看一下这个词,右键开镜,现在就是二点了,好放大直接叫8~8倍镜,缩小接到两倍镜,玩家其实感觉不出他是从7.5跳到八点的,他只知道哎我看到最大是八倍镜了,放到最小是两倍景啊,这是一个数值上的规则,应该好理解对吧,好,这是我们当前的这个倍率的一个缩放数值。那么最后的最后我们再给它添加一个乘号,添加一个乘号,formed text,给他一个乘号,然后是s value。

大括号里面需要输入你想要的数值,比如 sm value,然后将它链接到我们的放大倍率值。这样,我们的数值就会在前面加上一个乘号,乘上大括号里的内容。大括号里面的内容就是我们刚才一连串得到的数值。好,编译保存。这样的话,我们的瞄准镜右边就会有一个乘号了。就加了一个乘号。这样我们瞄准镜的倍率也有了。退出游戏。那么在这一期教程内容中,我们制作了右键开镜瞄准,以及它的一个乘号的显示。抱歉,右键开镜瞄准的模糊以及我们瞄准镜中的放大倍率的显示。时间还有很多,我们就继续讲下去吧,继续讲下去。接下来,有了瞄准镜之后,我们就可以开始打枪了。打枪的话,它的内容就比较复杂和开始难了。我们之前制作的一些内容都是在本地运行的。虽然我们将行走速度和状态同步到了服务器,但只是非常简单的做了一些数值和状态的同步,这是在服务器上的事件。但是从打枪开始,后面我们就要频繁地从服务器发送数据,要从服务器向客户端反馈这些数据。

所以接下来的内容,如果你对之前对于 v4 rpc 服务器和客户端同步的原理不是非常了解的话,可以去看一下我之前录制的一期服务器和客户端同步的讲解视频,是一个非常基础的讲解视频。看完之后,你可能会对此有所了解。如果没有看过,也没关系,可以慢慢地听,然后我会非常详细地把这个基础原理都讲解清楚。通过这个案例,你会对它的联网机制有所了解。好,那么开枪的话,首先第一件事就是要记住画图了。

我们来打开画图,给大家讲解一下它的基础原理。首先,有个玩家,他手里拿着一把枪,前面有个靶子,他想打靶子。首先,玩家肯定会在本地发出一枪,因为玩家需要通过鼠标左键去激发这一枪,让它打出去。所以,玩家在本地会有一个开火的操作。只是发生在本地的本地开火。在开火的同时,玩家肯定会有个瞄准的方向,使用准心去瞄准。这个方向就非常关键了,我们想要在服务器上传递的是当前玩家开火的信息,同时也要把他的瞄准方向一并发送给服务器。服务器就在上面。所以玩家开火这个操作会向服务器发送两个事件,第一个是玩家开火了,那么是哪个玩家开火,然后是玩家开火的方向。所以,它有两个事件,一个是开火,一个是开火的方向。这两个事件上传给服务器。

服务器在接收到这个消息之后,首先要判断你是否能开火,比如说玩家是否已经阵亡,如果他用了一些作弊手段,在正常状态下依然能够开火,或者玩家已经没有弹药了,或者玩家正在处于一个不能开火的状态。服务器会尽快进行一个简单的判断,这个判断主要是防止作弊。当然,本地也会进行一次判断。会有两次判断,本地判断和服务器判断。服务器会将开火的信息进行处理,从而在玩家的枪口位置生成一枚子弹。这个生成的子弹会在两个地方产生:第一个是在服务器本地,主要用于计算,拥有速度和碰撞体积;第二个是在玩家开火的位置,并且具有正确的朝向。服务器上的子弹将以红色表示,拥有速度和碰撞体积,并从枪口位置射出。

同时,开火成功后,服务器会通知各个客户端有玩家开火了。客户端会在玩家的位置同步这个消息,并在相应的位置生成子弹的特效。然而,真正的碰撞检测和子弹飞行的计算是在服务器上进行的,客户端只是表现。在客户端生成的子弹拥有速度和发射方向,但不具备碰撞体积。

因此,子弹是否击中敌人是在服务器上进行计算的。服务器和客户端同时发射出真实的子弹,但客户端只是生成表现。服务器会不断计算子弹飞行的距离和是否发生碰撞,并校正客户端子弹的飞行方向,以确保同步。在击中靶子时,服务器会进行碰撞检测,一旦击中,服务器就知道了。

当靶子被击中时,会触发一个击中事件。这个事件会导致所有客户端进行一次同步,生成类似的击中特效表现。值得注意的是,这些特效仅在客户端上呈现,而所有关于击中伤害和判定的计算都是在服务器上进行的,不可能在客户端本地执行这些计算。因此,击中事件和其表现之间存在一种分离,这样的逻辑相对容易理解。当一个玩家被击中时,他的血量会减少,这个血量变化会向所有客户端同步。如果玩家被击杀,客户端会收到关于玩家阵亡的消息,并同时更新得分。被击杀的玩家会离开游戏。这确保了游戏状态在所有客户端之间同步。因此,整个过程可以总结为一种同步逻辑,保证了游戏中击中事件的一致性。这涉及到表现和实际计算之间的分离,这种顺序和方式相对容易理解。

接下来,我们需要考虑玩家开火的逻辑。首先,我们需要确保玩家在开火之前进行了瞄准。然后,我们要检查玩家是否在开火间隔内,以及是否有足够的弹药。此外,还需要确保玩家没有在进行其他操作,比如更换弹药或者使用物品。只有当这些条件都满足时,玩家才能够开火。一旦玩家开火,我们需要获取玩家当前瞄准的目标点。这可以通过获取玩家的摄像机来实现。

获取到摄像机之后,首先我们需要获取当前摄像机的位置和朝向,以确定开火的起始点和方向。这可以通过获取摄像机的位置(get world location)和朝向(get forward vector)来实现。有了这些数据,我们就能够确定玩家的枪是朝着哪个方向射击。


在确定了开火的位置和方向之后,我们需要向服务器发送开火的请求。我们可以创建一个自定义事件(run service),将其设置为在服务器上运行(run on service),并勾选 reliable 功能,以确保可靠的传输。这个事件会调用服务器上的开火逻辑(open fire)。我们需要向服务器传递三个参数:开火点(fire location)、开火方向(fire vector)以及开火的玩家编号(fire player index)。

每个玩家都有一个唯一的玩家编号,我们可以通过一个整数变量来表示。在本地创建一个名为 my player index 的变量,用于存储当前玩家的编号。这个编号通常由服务器分配,并在玩家连接游戏时向其分发。为了防止作弊,这个编号通常会进行加密处理。因此,通过这样的逻辑,我们可以在本地确定开火的位置和方向,然后将请求发送给服务器,在服务器上进行开火操作,并确保每个玩家都具有唯一的玩家编号以确保游戏的安全性。

举个例子,如果玩家的编号非常简单,他可能会尝试去猜测其他玩家的编号,或者想方设法获取到其他玩家的编号,然后欺骗服务器。例如,他可能会声称另一个玩家开火了,而不是他自己。这样就会导致作弊行为。另外,一些游戏中的物资、玩家生命展示以及击杀得分等信息都是基于玩家的编号来判断的。因此,玩家的编号对游戏的正常进行至关重要。为了保证每个玩家的编号都是唯一且安全的,通常需要采用加密手段对其进行加密处理。在我们的案例中,暂时我们只是简单地使用整数作为玩家的编号。在实际游戏中,玩家的编号通常会由服务器分配,并在玩家连接游戏时向其分发。这样,每个玩家都有一个唯一且安全的编号,可以保证游戏的公平性和安全性。

开火之后,我们需要处理一些本地逻辑。首先,我们将 is fire 重置为 true,表示玩家处于开火状态。然后,我们设置一个开火间隔,以便在一定时间后退出开火状态。在这段时间内,玩家不能再次开火。开火间隔结束后,我们将 is fire 强制重置为 false,退出开火状态。同时,我们还需要检查玩家的弹药数量是否为零。因为每次开火都会消耗弹药,如果弹药数量为零,玩家需要进行一次装填弹药的操作。这还涉及到检查备用弹夹中是否还有足够的弹药,如果没有则无法进行装填操作。在服务器上,我们需要创建一个函数来处理开火事件。这个函数需要接收来自客户端的参数,包括开火位置、开火方向以及开火的玩家编号。然后,我们在玩家控制器中调用这个函数,并将参数传递给它,以便在服务器上执行开火逻辑。总的来说,通过这样的设计,我们可以确保玩家的编号是唯一且安全的,同时在本地和服务器上处理开火事件,确保游戏的正常进行。

那么要注意的一个细节是,如果你是游戏引擎和PC的初学者,刚开始接触游戏引擎并了解连接模块,比如我们的游戏模式(Game Mode),你需要知道它只存在于服务器中。因此,它只能在“run on service”模式下调用或同步。在本地是无法直接调用游戏模式的,这是需要注意的一个细节。另一个细节是,我们的演示(demo)只存在于服务器上,而UI界面肯定只存在于本地。服务器上不会有UI,因为服务器上没有玩家,所有玩家都是在本地玩游戏。因此,我们的HUD(Head-Up Display,头顶显示)肯定是在本地运行的。它通常会在玩家操作之前或在一些只在本地运行的自定义事件之后调用。在服务器上是无法调用HUD的,因为服务器上创建HUD是没有意义的。

在服务器上,我们调用这个函数(指的是“run service”)来计算子弹的运行轨迹。但要运行这个轨迹,我们必须发射一枚子弹,让它在服务器上运行。因此,我们需要创建一个子弹的蓝图,在服务器上飞行。同时,还会有一个在客户端飞行的子弹蓝图,用于玩家的视觉效果。在服务器上的子弹蓝图主要用于计算子弹的轨迹,而在客户端的子弹蓝图主要用于玩家的观察和展示。子弹蓝图里只需要添加一个能够让子弹飞行的组件即可,比如物体运动组件(Projectile Movement Component)。我们给子弹设置一个速度,并为其添加一个生命值,以防止游戏中出现大量无法销毁的子弹,从而增加服务器的负担。在事件图表中,我们将创建子弹击中逻辑,通常可以通过添加物理碰撞来模拟子弹的射击效果,但需要根据具体的游戏设计和需求来决定使用何种方法。

线性检测是一种常用的方法,特别适用于处理玩家的射击行为,比如开枪。在游戏中,射线在一个时间瞬间到达目的地,然后通过这个射线检测是否命中敌人。这种方法的消耗是最小的,因为它不需要产生实际对象,也不需要计算飞行轨迹,也不会出现时间差,子弹几乎是瞬间到达目标的,因此是一种非常高效和简便的运算方法。通常适用于手枪、机关枪等射击行为。然而,在一些情况下,尤其是当游戏对射击的还原度要求较高时,需要考虑到子弹的飞行轨迹和可能的偏移。此时,可以结合使用射线检测和物理碰撞的方式。这样,可以通过发射一个实际飞行的子弹,并在子弹飞行过程中使用射线检测来检测是否击中物体。为什么要采用这种结合的方式呢?

这是因为在某些情况下,特别是当子弹的速度非常快时,可能会出现尴尬的情况。例如,如果两帧之间的时间间隔正好让目标物体在两帧之间,游戏引擎可能会错过这个碰撞。因此,为了尽可能模拟真实的子弹飞行情况,我们需要通过发射实际的子弹来计算其飞行轨迹。

由于子弹飞行速度过快,使用碰撞体进行实际碰撞检测可能存在问题。当物体很小,并且恰好处于前后两帧之间时,可能会导致子弹穿过物体而不被检测到。游戏引擎只会计算子弹的运行轨迹,而不会实时检测碰撞。因此,我们需要在每一帧运行时,通过射线检测来判断子弹是否击中目标。

具体地,我们需要在每一帧记录子弹的当前位置,并在前后两帧之间发射一条射线,以检测是否有物体存在于子弹的运行轨迹上。如果射线与物体相交,即表示子弹击中了目标物体。如果没有相交,则继续在下一帧进行射线检测,直到击中为止。这种方法可以弥补因子弹飞行速度过快而导致的碰撞检测遗漏的情况。因此,我们需要在每一帧运行时记录子弹的位置,并通过射线检测来判断是否击中目标物体。那么本期教程就先到这里了。
标题:如何用UE5做一款大逃杀游戏 05:子弹开火逻辑
链接:https://www.373wan.com/news/xydt/9453.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
如何在抖音中设置只看三天和限时可见功能

随着抖音的发展,越来越多的用户开始使用抖音来记录自己的生活和分享自己的想法。为了保证用户的隐私和安全,抖

2024-06-14
阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭

阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭[多图],阴阳师4月22日更新的内容有哪些?版本更新

2024-06-14
四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址

四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址[多图],2021四川电视台经济频

2024-06-14
湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口

湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口[多图],湖北电视台生活频道

2024-06-14