hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

射击游戏中准心与枪弹弹道的探究

2019-11-18杂谈搜奇网27°c
A+ A-

媒介

  现如今,佳构游戏合作猛烈,各大游戏厂商都在争相推出“3A”级质量的游戏。而现在比较热点的科幻、战役、行为等品类大多都有枪械射击内容,因此,“玩枪”便成了很大一部分游戏中常见的弄法。当前比较热点的任务招呼系列、战地系列、无主之地系列、战役机械系列另有近来盛行的吃鸡类游戏(绝地求生、碉堡之夜)等等都是玩枪,中心弄法范例上都是属于射击类游戏。因此做好兵器与射击体验,复原传神的射击情况,便成了这类游戏的中心卖点。

射击游戏的分类

  现在的射击游戏重要分为两种,一种为“第一人称射击游戏”(FPS)与“第三人称射击游戏”(TPS)。

第一人称

  第一人称射击游戏是以玩家主视角举行的射击游戏。玩家不再像别的游戏范例一样支配屏幕中的假造人物来举行游戏,而是设身处地的主视角,体验游戏带来的视觉打击,这就大大增强了游戏的主动性和真实感。

  如上两张图分别是1999年出售的反恐精英( Counter-Strike )与2019年出售的任务招呼:现代战役 ( Call of Duty: Modern Warfare )。可以看到,时隔20年,场景与枪械变得越发邃密与传神,界面变得优美与合理,但稳定的是,屏幕中心都做有一个“准心”。

第三人称

  第三人称射击游戏与第一人称区分在于,屏幕上显现的主角的视野差别,而且第三人称中玩家掌握的游戏人物在游戏屏幕上是可见的,因此第三人称射击游戏加强调更强调行为感。

  如上3张图都是“幽魂行为:断点”的游戏画面,可以看到,在没有对准时屏幕中心是没有准心的,这时候可以将注意力集合在环境、角色行为、游戏剧情等等。当翻开对准时,就会涌现屏幕中心的准心,还可以经由历程Alt键切换第一人称与第三人称(第二张图与第三张图)。

准心

  经由历程上述的引见可以看到,不管是第一人称照样第三人称,屏幕中心都邑有“准心”以轻易玩家对准。那为何要有准心呢?为何有了准心以后,我们在游戏中就可以对准目的呢?

实际中的射击

  我们在物理课程中相识过,假如抛去枪的庞杂构造不谈,枪的事情道理简朴来说就是,弹头在枪管中遭到推进力后做抛物线活动。

  假如弹头在活动历程当中碰撞到目的,则示意击中;若未碰撞到目的,则示意未击中。那末我们怎样对准才击中目的呢?

  如图所示,蓝色的水平线则是对准线,代表对准方向;绿色是枪管轴心线,代表枪管的指向方向;赤色则是枪弹的遨游飞翔轨迹。假定枪弹每次从枪口中射出的速率是牢固的,空气阻力也是牢固的,枪弹遭到的重力也是牢固的,那末依据上图的对准体式格局,射击掷中的“远交点”也是牢固的。换句话说,用这把枪和这个对准角度的话,只能击中间隔枪口x米的目的。那末假如我们射击统一方向上比x米更近或更远的目的怎样办呢?

  如上图所示,分别为步枪和狙击枪的射击间隔调解要领。步枪中有对准间隔刻度线,调治刻度即可;狙击枪在对准高倍镜中有刻度线,依据目的的间隔,运用对应的对准刻度线即可;手枪由于射击间隔短(大部分射击间隔在50米之内),对准偏差较小,所以不必调治。

游戏中的射击

  而在游戏中,未开对准镜的情况下,角色的持枪行为每每如上图所示,将枪牢固于肘关节处。为何要如许持枪呢?由于如许持枪姿态可以减小在第一人称人下枪所遮住的视野,提拔游戏体验,而如许的持枪行为,在实际中是打不准目的的(由于没有三点一线的对准)。在游戏里为了能越发便利开枪,因此加入了准心的观点。

  有了准心以后,玩家就可以越发轻易地对准目的,从而取得更好的射击体验。但这类准心“指哪打哪”的游戏结果是怎样完成的呢?

UE4中的枪弹弹道

  我刚开始在UE4中完成枪弹弹道时,主意很简答,既然枪弹是从枪中射出的,那末枪弹的遨游飞翔方向固然就是枪口的朝向。为了使枪弹可以击中“准心”的位置,我调解了枪在手中的朝向。

题目

  经由重复测试后发明,不管怎样调,只能保证在某一牢固射击间隔时,弹着点能与准心重合。当射击间隔转变时,枪弹就没法击中准心位置,这是什么原因呢?

  如上图所示,假定玩家(摄像机)与枪处在统一水平面,从俯视的角度来看,玩家的准心永久指向正前方(用赤色线条示意),而枪则在玩家左手或右手,其朝向(用绿色线条示意)与玩家朝向存在夹角Θ。在该夹角下,只要玩家与目的间隔y时,弹着点才恰好在准心上。不管怎样调解夹角Θ,都只要某一个间隔下弹着点恰好落在准心上(由于两条不平行的直线永久只要一个交点)。而实际上枪与玩家(摄像头)并不在统一水平面,在三维坐标系下,两条不平行的直线最多有一个交点(能够没有交点)。

  那末该怎样处理该题目呢?既然两条线只要一个交点,那末能不能依据差别的射击间隔转变枪的朝向,使交点一直在准心对准位置呢?

  要想调解枪的朝向,就必须调解枪在玩家动画的骨骼中的相对位置。而且要依据射击间隔及时调解(玩家准心瞄到的障碍物的间隔),这个 运算量会非常大,几乎是不能够完成的,所以这条路走不通,该怎样办呢?

处理计划

  既然枪的方向不轻易调解,枪弹的方向总可以掌握吧!可以在开枪时,先依据玩家(摄像机)的朝向,做射线检测,肯定目的弹着点,然后再掌握枪弹的遨游飞翔方向为枪口飞向弹着点,这不就可以完成不管玩家瞄向那里,枪弹都可以击中“准心”的位置的需求吗。

盘算弹着点

  如上蓝图代码所示,用摄像机方向(即准心的朝向)做射线检测,返回击中的弹着点坐标与材质(轻易后续播放击中殊效),若未击中任何物体(比方朝天上开枪),则返回射线检测的尽头,轻易客户端展现弹道。

播送开枪

  如上蓝图代码所示,取得弹着点坐标与材质后举行播送,在所有客户端上播放该玩家的开枪动画(兵器殊效),并挪用C++函数,应用GamePlayTask生成弹道。

void AWeapon::GenerateBulletTrack(FVector HitLocation, UPhysicalMaterial* HitMaterial)
{
    // 枪口坐标
    FVector MuzzleLocation = Mesh->GetSocketLocation("Muzzle");
    // 向量方向:尽头 - 出发点
    FVector Direction = HitLocation - MuzzleLocation;
    // 遨游飞翔速率
    FVector Speed = Direction.Rotation().Vector() * 10000;
    // 遨游飞翔时候:间隔 / 速率
    float Time = Direction.Size() / Speed.Size();
    // 击中点殊效
    UParticleSystem* HitFX = nullptr;
    // 击中点材质
    if (HitMaterial)
    {
        EPhysicalSurface SurfaceType = HitMaterial->SurfaceType;
        // 该枪已设置该材质范例的击中殊效
        if (VarHitFXs.Contains(SurfaceType))
        {
            HitFX = VarHitFXs[SurfaceType];
        }
    }
    // 运转枪弹轨迹的GamePlayTask
    UBulletTrackTask * TrackTask = UBulletTrackTask::InitBulletTrack(BulletTrackComponent, MuzzleLocation, Speed, TargetFX, HitFX, Time, this, HitLocation);
    TrackTask->ReadyForActivation();
}

  如上C++代码所示,依据击中点坐标,盘算出枪弹的遨游飞翔方向与间隔,然后盘算出遨游飞翔时候,并用这些参数开启枪弹轨迹的GamePlayTask,用于显现客户端的枪弹轨迹及击中殊效。

枪弹弹道

void UBulletTrackTask::TickTask(float DeltaTime)
{
    // 纪录遨游飞翔时候
    ActiveTime += DeltaTime;
    UWorld* World = GetWorld();
    check(World);
    const FVector OldLocation = CurrentLocation;
    // 匀速间隔公式:间隔 = 速率 * 时候
    FVector MoveDistance = CurrentVelocity * DeltaTime;
    // 新位置
    CurrentLocation = OldLocation + MoveDistance;
    // 更新轨迹殊效的位置与朝向
    if (TrackComponent)
    {
         TrackComponent->SetWorldLocationAndRotation(CurrentLocation, UKismetMathLibrary::MakeRotFromX(CurrentVelocity.GetSafeNormal()));
    }
    // 凌驾遨游飞翔时候
    if (ActiveTime >= LifeTime)
    {
        // 有击中殊效
        if (HitFX)
        {
            // 显现击中殊效
            UGameplayStatics::SpawnEmitterAtLocation(World, HitFX, HitLocation);
        }
        EndTask();
    }
}

  经由历程运转该枪弹轨迹的GamePlayTask,每帧会更新枪弹轨迹殊效的位置,显现枪弹的遨游飞翔历程,假如凌驾了枪弹的遨游飞翔时候,则在服务器已盘算出的击中点发生击中殊效(受伤害殊效)等等,完成了枪弹老是能击中游戏准心对准的目的。

瞻望

  上述处理计划是弹道完成的较简化版本,由于没有斟酌枪弹的遨游飞翔时候、枪弹重力、枪械反冲力、空气阻力等诸多要素。假如斟酌这些要素的话,服务器就不合适直接用射线检测来盘算弹着点,而是一样改用GamePlayTask来完成,以便可以准确盘算枪弹遨游飞翔历程当中的受力、遨游飞翔碰撞等等题目。但如许做势必会增添服务器中弹着点盘算耗时(由于会增添枪弹遨游飞翔时候),加大客户端的表现难题(让玩家感遭到开枪有延时),这也是该计划后续的难点。

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
射击游戏中准心与枪弹弹道的探究

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282328.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>