这就是传说中的金币,金币前后被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