Интервал между вражескими выстрелами
Я работаю над простым проектом, который послужит опорой для будущих.
Моя проблема в том Когда я перехожу из моего состояния "Поиск" в мое "атакующее" состояние, я проверяю, не попал ли я в зону действия огня врагов. Если я, это стреляет в меня. Для этого я поместил вызов функции 'FireRocket' внутри оператора ' if(Enemy!= None && VSize(Location - Enemy.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
}
1 ответ
Решено! Вот отредактированный код. Теперь выстрелы производятся с интервалом в 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');
}