Need to know why this script only works sometimes?

The script below is intended to stop the player from entering the next level without first killing all of the enemy. This does work - but on occasions it does not.

var dangerDistance : float = 10f; //distance is set at 10k in inspector

private var enemies : GameObject;

function Start(){

enemies = GameObject.FindWithTag("Enemy");	

}

function ProximityCheck() {

for ( var i : int = 0; i < 1; i++) {
    
    if (Vector3.Distance(transform.position, enemies.transform.position) < dangerDistance) {
            return true;
            
    }
}
    
    return false;

}

function OnCollisionEnter(collision : Collision) {

if(collision.gameObject.tag == "Player" && enemies == false) {
	
	Application.LoadLevel("Level2");
	
}

}

The problem is very likely that you are just checking the distance to the first enemy you find. Following changes should improve it.

  1. GameObject.FindWithTag() returns one almost random enemy (probably the first match while traversing the scene hierarchy). You should change your enemies member variable to an array and use this.

    enemies = GameObject.FindGameObjectsWithTag(“Enemy”)

  2. after doing point 1, your loop can be modified to actually make sense:

    for ( var i : int = 0; i < enemies.Length; i++) {
    if (Vector3.Distance(transform.position, enemies*.transform.position) < dangerDistance) {*
    return true;
    }
    }
    3) If your list of enemies is completely static, the code will be fine. Otherwise you need to retrieve the list of enemies before checking the distance instead of just getting them once in the Start() method.