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);

      }
    }

      

      

  • 相关阅读:
    父子进程 signal 出现 Interrupted system call 问题
    一个测试文章
    《淘宝客户端 for Android》项目实战 html webkit android css3
    Django 中的 ForeignKey ContentType GenericForeignKey 对应的数据库结构
    coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)
    一个 PAM dbus 例子
    漫画统计学 T分数
    解决 paramiko 安装问题 Unable to find vcvarsall.bat
    20141202
    js
  • 原文地址:https://www.cnblogs.com/NEOCSL/p/3371316.html
Copyright © 2011-2022 走看看