我已经为游戏添加了足够多的武器,虽然特性很多,但是最后一个非常酷的武器还没有添加,这就是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);
}
}