Artificial intelligence 敌方射击间隔

Artificial intelligence 敌方射击间隔,artificial-intelligence,unreal-development-kit,unrealscript,Artificial Intelligence,Unreal Development Kit,Unrealscript,我正在做一个简单的项目,它将成为未来项目的支柱 我的问题是。当我从“寻找”状态移动到“攻击”状态时,我会检查自己是否在敌人的火力范围内。如果我是,它就会向我开枪。为此,我在“if(敌方!=none&&VSize(Location-敌方.Location)

我正在做一个简单的项目,它将成为未来项目的支柱

我的问题是。当我从“寻找”状态移动到“攻击”状态时,我会检查自己是否在敌人的火力范围内。如果我是,它就会向我开枪。为此,我在“if(敌方!=none&&VSize(Location-敌方.Location) 现在,计时器只有在我离开敌人的射程时才开始计数,他确实开火了,但同样,只有在我超出敌人的射程时才开始计数。当我回到它的射程参数时,他停止向我开火

问题在于“攻击”状态

提前感谢您的帮助

class AwesomeRangedBoss extends AwesomeEnemy
placeable;

var float FireInterval;

////EVENTS////

auto state Seeking
{
    function Tick(float Deltatime)
    {
        local vector NewLocation;

        if(Enemy == none)
        {
            GetEnemy();
        }

        else if(VSize(Location - Enemy.Location) < FollowDistance)
        {
            NewLocation = Location;
            NewLocation += normal(Enemy.Location - Location) * MovementSpeed * DeltaTime;
            SetLocation(NewLocation);

            if(VSize(NewLocation - Enemy.Location) < AttackDistance)
            {
                GoToState('Attacking');
            }
        }
    }
}

state Attacking
{
    function Tick(float Deltatime)
    {
        if(Enemy == none)
        {
            GetEnemy();
        }

        if(Enemy != none && VSize(Location - Enemy.Location) < AttackDistance)
        {
            //SetTimer(FireInterval, true, 'FireRocket');
            //FireRocket();
        }
        if(VSize(Location - Enemy.Location) > AttackDistance)
        {
            GoToState('Seeking');
        }
    }
}

/////////////////////////
function FireRocket()
{
    local UTProj_Rocket MyRocket;
    `log("BOOM!");

    MyRocket = spawn(class'UTProj_Rocket', self,, Location);
    MyRocket.Init(normal(Enemy.Location - Location));

    MyMesh.SetMaterial(0, AttackingMat);
    SetTimer(1, false, 'EndAttack');
}

event TakeDamage(int DamageAmount, Controller EventInstigator,
 vector HitLocation, vector Momentum, class<DamageType> DamageType,
optional TraceHitInfo HitInfo, optional Actor DamageCauser)
{
  Health--;

  if(Health == 0 && EventInstigator != none &&
EventInstigator.PlayerReplicationInfo != none)
    {
        WorldInfo.Game.ScoreObjective(EventInstigator.PlayerReplicationInfo, 1);

        Destroy();
    }
}

defaultproperties
{
    BumpDamage = 15.0

    MovementSpeed = 256
    FollowDistance = 1512
    AttackDistance = 1024
    Health = 5
    FireInterval = 1

    Begin Object Name=EnemyMesh
        Scale3D=(X=1.0, Y=1.0, Z=2.0)
    End Object

    Begin Object Name=CollisionCylinder
        CollisionRadius=128.0
        CollisionHeight=256.0
    End Object
}
类AwesomeRangedBoss扩展了awesome
可放置的;
var浮动间隔;
////事件////
自动状态搜索
{
函数刻度(浮点Deltatime)
{
局部向量新定位;
如果(敌人==无)
{
得到敌人();
}
否则如果(VSize(位置-敌方位置)<跟车距离)
{
新地点=地点;
新位置+=正常(敌方位置-位置)*移动速度*延迟时间;
设置位置(新位置);
如果(VSize(新位置-敌方位置)<攻击距离)
{
GoToState(‘攻击’);
}
}
}
}
状态攻击
{
函数刻度(浮点Deltatime)
{
如果(敌人==无)
{
得到敌人();
}
如果(敌人!=无&&VSize(位置-敌人位置)<攻击距离)
{
//SetTimer(FireInterval,true,“FireRocket”);
//火箭弹();
}
如果(VSize(位置-敌人位置)>攻击距离)
{
GoToState(“Seeking”);
}
}
}
/////////////////////////
函数FireRocket()
{
本地UTProj_火箭MyRocket;
`原木(“轰!”);
MyRocket=spawn(类“UTProj_Rocket”,自身,位置);
MyRocket.Init(正常(敌方位置-位置));
MyMesh.SetMaterial(0,附件);
SetTimer(1,false,'EndAttack');
}
事件伤害(智力伤害金额、控制者事件煽动者、,
向量命中位置,向量动量,类损伤类型,
可选TraceHitInfo HitInfo,可选Actor DamageCauser)
{
健康--;
如果(运行状况==0&&Event煽动者!=无&&
event煽动者.playerreplicationfo!=无)
{
WorldInfo.Game.ScoreObjective(Event煽动者.PlayerReplicationInfo,1);
破坏();
}
}
默认属性
{
碰撞损伤=15.0
移动速度=256
跟车距离=1512
攻击距离=1024
健康=5
燃烧间隔=1
开始对象名称=EnemyMesh
比例3d=(X=1.0,Y=1.0,Z=2.0)
终端对象
开始对象名称=碰撞圆柱体
碰撞半径=128.0
碰撞高度=256.0
终端对象
}

已解决!这是经过编辑的代码。现在以1秒间隔正确射击

state Attacking
{
    function Tick(float Deltatime)
    {
        //HasFired = true;

        if(Enemy == none)
        {
            GetEnemy();
        }

        if(Enemy != none && VSize(Location - Enemy.Location) < AttackDistance)
        {
            ShootRocket();
        }
        if(VSize(Location - Enemy.Location) > AttackDistance)
        {
            GoToState('Seeking');
        }
    }
}

/////////////////////////
function ShootRocket()
{
    local UTProj_Rocket MyRocket;

    if(Enemy != none && VSize(Location - Enemy.Location) < AttackDistance && HasFired == false)
    {
        `log("BOOM!");

        MyRocket = spawn(class'UTProj_Rocket', self,, Location);
        MyRocket.Init(normal(Enemy.Location - Location));

        MyMesh.SetMaterial(0, AttackingMat);
        SetTimer(1, false, 'EndAttack');

       HasFired = true;

        if(HasFired == true)
        {
            SetTimer(FireInterval, false, 'IsAttacking');
        }
    }
}

function IsAttacking()
{
    HasFired = false;
    GoToState('Attacking');
}
状态攻击
{
函数刻度(浮点Deltatime)
{
//hasfield=true;
如果(敌人==无)
{
得到敌人();
}
如果(敌人!=无&&VSize(位置-敌人位置)<攻击距离)
{
射击火箭();
}
如果(VSize(位置-敌人位置)>攻击距离)
{
GoToState(“Seeking”);
}
}
}
/////////////////////////
函数ShootRocket()
{
本地UTProj_火箭MyRocket;
if(敌方!=无&&VSize(位置-敌方位置)
如果你已经解决了这个问题,你应该把它作为一个答案发布出来。谢谢你的介绍:)