zoukankan      html  css  js  c++  java
  • 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);

      }
    }

      

      

  • 相关阅读:
    .NET HttpWebRequest应用
    .NET 文件上传和文件接收
    小程序报错:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2
    发布微信小程序体验版
    .NET 通过entity framework报数据库连接错误:ORA-01017: invalid username/password; logon denied
    将Oracle 12c的某用户数据迁移至OracleXE的用户
    C# Oracle 时间字符串转时间类型
    在.NET中调用Java的类
    Oracle 取前几条记录
    oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
  • 原文地址:https://www.cnblogs.com/NEOCSL/p/3371316.html
Copyright © 2011-2022 走看看