Beam武器

  我已经为游戏添加了足够多的武器,虽然特性很多,但是最后一个非常酷的武器还没有添加,这就是Beam。Beam在EPOC中非常酷。

  因此我从UTBeamWeapon开始挖掘。

  有两个

  var ParticleSystem BeamTemplate[2];   //数组代表了武器的设计模式FireMode

  var ParticleSystemComponent BeamEmitter[2]; //  用于激活使用

  

  var name BeamSockets[2];  //我相信是枪口

  var name EndPointParamName;  //Beam的终点吧

  这里面我遇到了一个陌生的类var ForceFeedbackWaveform BeamWeaponFireWaveForm;

  目前没有想法挖掘,也许是解决红外线末端点的方法。

  我看到了一个非常传统的加载Beam的函数

  simulated function AddBeamEmitter()

  {

    if(BeamEmitter[CurrentFireMode]==none)

  {

      if(BeamTemplate[CurrentFireMode]!=none)   //我们将粒子加载给离子组件

      {

        BeamEmitter[CurrentFireMode]=new(outer) class'ParticleSystemComponent';

        BeamEmitter[CurrentFireMode].SetTemplate(BeamTemplate[CurrentFireMode]);   //因为这些东西都是动态生成的,我们不能写入DefaultProperpty中

        BeamEmitter[CurrentFireMode].SetHidden(true);  //这里非常有趣

         BeamEmitter[CurrentFireMode].SetTickGroup(TG_PostUpdateWork);

        BeamEmitter[CurrentFireMode].bUpdateComponentInTick=true;

        BeamEmitter[CurrentFireMode].SetIgnoreOwnerHidden(true);

        SkeletalMeshComponent(mesh).AttachComponentToSocket(beamEmitter[CurrentFirfeMode],BeamSockets[CurrentFireMode]);  
      }
  }

      else

      BeamEmitter[CurrentFireMode].ActivateSystem();
  }

  我们来看看Epic是怎样关闭Beam的

  simualted function KillBeamEmitter()

{

  if(BeamEmitter[CurrentFireMode]!=none)

  {

    BeamEmitter[CurrentFireMode].SetHidden(true);

    BeamEmitter[CurrentFireMode].DeactivateSystem();
  }
}

//功能不少,还有一项隐藏

  simulated function HiddenEmitter(bool bHide)

{

  if(BeamEmitter[CurrentFireMode]!=none)

  BeamEmitter[CurrentFireMode].SetHidden(bHide)
}

//这将会是最重要的一个功能了,更新Beam的终点

simulated function UpdateBeamEmitter(vector FlashLocation,vector HitNormal,actor HitActor)

{

  if(BeamEmitter[FireMode]!=none)

  {

    //我们不设第一人称,我们是第三人称

    BeamEmitter[CurrentFireMode].SetVectorParameter(EndPointParamName,FlashLocation);  //一个是Beam的终点名Beam内都有,FlashLocation
  

  }
}

simulated function ProcessBeamHit(vector StartTrace,vector AimDir,out ImpactInfo TestImpact,float DeltaTime);

//这个函数处理Beam撞到的东西怎么处理,bInfoOnly为真时,这个函数被Tick调用

simulated function UpdateBeam(float DeltaTime)

{
  

  local vector StartTrace,EndTrace,AimDir;

  local ImpactInfo realImpact,NearImpact;

  StartTrace=Instigator.GetWeaponStartTracelocation();   //从玩家的枪口获取Trace的起始

  AimDir=Vector(GetAdjustedAim(StartTrace));   //GetAdjustedAim起始了一连串函数让Pawn,Controller和Weapon都知道从哪里发射

  EndTrace=StartTrace+AimDir*GetTraceRange();

  //跟踪一次攻击

  RealImpact=CalcWeapnFire(StartTrace,EndTrace);

  bUsingAimingHelp=false;

  if((RealImpact.HitActor==none||!RealImpact.HitActor.bProjTarget)

  {

    NearImpact=InstantAimHelp(StartTrace,EndTrace,RealImpact);
  }

  if(NearImpact.HitActor!=none)

  {

    bUsingAimingHelp=true;
    ProcessBeamHit(StartTrace,AimDir,NearImpact,DeltaTime);

    UpdateBeamEmitter(NearImpact.HitLocation,NearImpact.HitNormal,NearImpact.HitActor);

  }

  else

  {

    ProcessBeamHit(StartTrace,AimDir,RealImpact,DeltaTime);
    UpdateBeamEmitter(RealImpact.HitLocation,RealImpact.HitNormal,RealImpact.HitActor);

  }
}

  

  

原文地址:https://www.cnblogs.com/NEOCSL/p/3371316.html