# Force enemy to fire at a specific point, == appears not to work.

Hey guys.

. What I'm attempting to do (and having little success with) is to sort the script so that when the enemy is at for example equal to a certain point i.e: -3 in the .y axis a bullet is fired.

If anyone knows the best way of doing this then I would greatly appreciate it, I'm loving unity and I'm learning quite quick, however in this case I'm confused as to why if position == (insert number here) doesn't appear to work, clearly the enemy has to cross y.3 in order to reach .y 6 for example.

Right now the script is written so that if the enemy is below a certain point then he will stop, and if his STOP position is equal to what I want then he will fire. I'm assuming that if position.y == doesn't work because the enemy is moving too fast, however I would like to get around this problem without slowing the enemy movement down.

Currently My enemy script is as follows

``````using UnityEngine;
using System.Collections;

public class Enemy_Script : MonoBehaviour
{
public float MinSpeed;
public float MaxSpeed;

public float currentSpeed;
private float x, y, z;
public GameObject Projectile;
float firingRate = 2f; //delay between shots, in seconds
float lastFired = -100f; //absolute time of last fired shot

// Use this for initialization
void Start()
{
//currentSpeed = Random.Range(MinSpeed, MaxSpeed);
currentSpeed = 4;
x = Random.Range(2f, 2f);
y = 7.0f;
z = 0.0f;

transform.position = new Vector3 (x, y, z);
}

// Update is called once per frame
void Update()
{
float amtToMove = currentSpeed * Time.deltaTime;
transform.Translate(Vector3.down * amtToMove);

if (Time.time < lastFired + firingRate)
{
return;
}

if (transform.position.y <= -6.0)

{
currentSpeed = 4;
// currentSpeed = Random.Range(MinSpeed, MaxSpeed);
transform.position = new Vector3(x, y, z);
}
lastFired = Time.time;
//if (transform.position.y <= 4f)
if (transform.position.y <= 2f)
//currentSpeed = Random.Range(0, 0);
{
Vector3 rightposition = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
Instantiate(Projectile, rightposition, Quaternion.Euler(0, 0, 90));

}

}
}

``````

Thanks guys, I'm a little unsure how to stick a reward on my post, I cant see the option anywhere.

The reason why == doesn't work on position is due to float inaccuracy.

The method to get around this is to use Mathf.Approximately or test for a range of values e.g.

``````if(pos >= 3 && pos <= 4){
// do something
}

``````

Just make sure that the movement speed of the object is smaller than the range you're testing for or else it's possible that the object "leaps over" the detection zone.

P.S. you can only post bounties for questions after you've gained a certain number of points. However, you can give points to people just by up voting and marking answers as correct with the green tick ;) ;)

You're right when you say that the object must cross the plane running through 0,3,0. Unity (and computer systems in general) operate in discrete time steps. So at one point it may be at 2.9 and in the next sample, it will be at 3.1. These distinctions are difficult to detect with the human eye, but they happen nonetheless. If it's very important that the enemy start firing as close to y=3 as possible, I'd set up a trigger collider at y=3 and instead of checking the object's position in update, have the trigger send a message to the object to start firing.