9:《地牢守卫者》代码分析:AntManaToken

  这就是传说中的金币,金币前后被Controller,和Player分别调用。

在controller中出现在以下地方:

function CollectManaToken(AntManaToken token)

{

  token.Collected(AntPawn(pawn));

  AddManaPower(token.TokenPower);
}

显而易见该函数一方面是通知token自己已经被使用了,另一方面是加入到controller的power中。

function AddManaPower(float  tokenPower)

{            //ManaPower是controller的属性

  ManaPower=FClamp(ManaPower+tokenPower,0,MaxManaPower);

}

  接下来是AntPawn中有关AntManaToken的函数了:

实际上是该函数调用了Controller的CollectManaToken函数,也就是说Pawn启发了AntManaToken的交互事件发生,事实上也只有pawn和AntManaToken的距离能做出更好的系统。

function CheckForManaTokens()

{

  local AntManaToken token;

  foreach OverLappingActors(class'AntManaToken',token,ManaTokenRadius)

  {

    token.AttractTo(self); //将Attractor指向pawn,紧接着tick函数会将其吸向pawn

    if(VSize(token.location-location)<ManaTokenCollectRadius)

    AntController(controller).CollectManaToken(token);
  }
}

现在进入AntManaToken:发现AntManaToken有以下变量

var AntEmitterSpawnable CollectedEmitterTemplate;    //收集到时应该有一个粒子效果

var AntPawn MyAttractor;          //自己的吸引者

var bool WasCollected;           //被收集的标志位,以备用来销毁


发现controller的token.Collected(AntPawn(pawn));

function Collected(AntPawn pawn)

{

  WasCollected=true;

  Spawn(CollectedEmitter.class,,Location,rotation,CollectedEmitter,true);

  LifeSpan=-1;

}

  标志位决定了token的销毁

  function Destroyed()

{

  if(WasCollected)

  super.Destroyed();
}

  看到了Pawn中还有一个地方调用了token.attractTo(self)

function AttractTo(AntPawn attractor)

{

  MyAttractor=attractor;

}


  有一个Tick函数检查MyAttractor

  event Tick(float DeltaTime)

{

  super.Tick(DeltaTime);

  if(MyAttractor!=none)

  {

    staticMeshComponent.AddForce(Myattractor.ManaTokenAttractorForce*normal(MyAttractor.location-location));
  }

  
}

至此ManaToken结束,下一节研究Emitter

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