If the player tank is close enough to attack our AI tank, we will rotate the turret object to face the player tank, and then start shooting. Then, if the player tank goes out of range, the tank goes back to the Patrol state:
protected void UpdateAttackState()
{
//Set the target position as the player position
destPos = playerTransform.position;
//Check the distance with the player tank
float dist = Vector3.Distance(transform.position,
playerTransform.position);
if (dist >= 200.0f && dist < 300.0f)
{
//Rotate to the target point
Quaternion targetRotation =
Quaternion.LookRotation(destPos -
transform.position);
transform.rotation = Quaternion.Slerp(
transform.rotation, targetRotation,
Time.deltaTime * curRotSpeed);
//Go Forward
transform.Translate(Vector3.forward *
Time.deltaTime * curSpeed);
curState = FSMState.Attack;
}
//Transition to patrol is the tank become too far
else if (dist >= 300.0f)
{
curState = FSMState.Patrol;
}
//Always turn the turret toward the player
Quaternion turretRotation =
Quaternion.LookRotation(destPos
- turret.position);
turret.rotation =
Quaternion.Slerp(turret.rotation, turretRotation,
Time.deltaTime * curRotSpeed);
//Shoot the bullets
ShootBullet();
}
private void ShootBullet()
{
if (elapsedTime >= shootRate)
{
//Shoot the bullet
Instantiate(Bullet, bulletSpawnPoint.position,
bulletSpawnPoint.rotation);
elapsedTime = 0.0f;
}
}