[towerDefence] towers don't shoot first enemy.[solved]

hi I’m working on a new game. and i have some problems with this one.
i have some problems with my script:

  • towers keep shooting even if they are out of range.[fixed]

  • my array shows only 1 enemy [fixed]

  • ArgumentOutOfRangeException: Argument is out of range. [fixed]

  • towers wont shoot first enemy in array. [fixed]
    edit : new code.

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;

    public class basicTower : MonoBehaviour
    {

    public List<GameObject> enemys = new List<GameObject>();
    

    // public List allEnemys = new List();

    public int targetNumber = -1;
    public bool target = false;
    Vector3 towerpos = new Vector3(); // creating var for tower position
    public GameObject bullet_prefab;// type of bullet
    public Transform CurrentTarget;
    public GameObject Enemy;
    
    public float ShotDelay = 5f; // delay between shots
    public float ViewDistance = 10;
    public bool shootClosest= true;
    public bool shootFurtherst = false;
    
    public bool RedBlue = true;
    
    private float lastShotTime;
    private int restetTimer=0;
    
    float thisDistance;
    float closestDistence;
    
    
    public float modifier = 1f; // negative or posetive effect on tower	
    	
    
    
    	void Start () 
    	{	gameObject.AddComponent<SphereCollider>().radius = ViewDistance ;
    		gameObject.collider.isTrigger = true;
    		
    		modifier = 1f;// resetting modifier before placement
    		towerpos = transform.position; // setting tower position
    		//Debug.Log(towerpos); // tower position check
    		lastShotTime = Time.time;
    	Debug.Log(" LAST SHOT TIME: " + lastShotTime);
    
    
    	
    }
    	
    	
    void Update()
    {	restetTimer ++;
    	targetNumber = -1;
    
    
    
    	
    
    	if (shootClosest == true && shootFurtherst == true)
    	{
    		shootFurtherst = false;
    	}
    	
    	if (shootClosest == true)
    	{
    		GetEnemiesInRange();
    		//ClosestTarget();
    		shootFurtherst = false;
    	}
    	if (shootFurtherst == true)
    	{
    		GetEnemiesInRange();
    		//FurtherstTarget();
    		shootClosest = false;
    	}
    	
    
    	if (target)
    	{	if (targetNumber >0)
    		{
    
    			CurrentTarget = enemys[targetNumber].transform;
    

    // Debug.Log(CurrentTarget.transform.position);
    //transform.LookAt(CurrentTarget.position);
    }

    		//start attacking
    		if ((Time.time - lastShotTime) > (modifier * ShotDelay )){
    			Attack();
    		}	
    	}
    }
    
    
    
    	void Attack ()
    	{
    		//	Debug.Log ("ATTACKING:"+this.name);
    	if (targetNumber > -1) {
    					GameObject gam = gameObject; // declerating gameobject as gam
    					GameObject thebullet = (GameObject)Instantiate (bullet_prefab, gam.transform.position, gam.transform.rotation); // creating bullet at tower position
    					thebullet.GetComponent<projectile> ().tower = gameObject; // giving projectile parrent info
    					lastShotTime = Time.time;
    					//	Debug.Log(this.name+" LAST SHOT TIME: " + lastShotTime);
    			}
    	}	
    
    
    
    
    void GetEnemiesInRange()
    {
    
    	enemys.Clear(); // clear enemy list
    	GameObject [] allEnemys; // local array of alll enemys
    	//Debug.Log ("enemys" + enemys.Count);
    
    
    	float distance;
    	
    	if (RedBlue == true) 
    	{
    		allEnemys = GameObject.FindGameObjectsWithTag ("EnemyR");	
    		//Debug.Log ("allenemys" + allEnemys.Length);
    		for (int i = 0; i < allEnemys.Length; ++i) 
    		{
    			distance = (allEnemys *.transform.position - towerpos).magnitude;*
    

_ if (distance < (ViewDistance*0.1f))_

  •  		{*
    

_ enemys.Add (allEnemys );_
* target = true;*
* }*
* }*
* }*
* if (RedBlue == false)*
* {*
* allEnemys = GameObject.FindGameObjectsWithTag (“EnemyB”); *
* for (int i = 0; i < allEnemys.Length; ++i)*
* {*
_ distance = (allEnemys .transform.position - towerpos).magnitude;
if (distance < (ViewDistance 0.1f) )
{
enemys.Add (allEnemys );
target = true;
}
}
}*_

* if (enemys.Count < 0) {*
* targetNumber = -1;*
* }*
* else*
* {*
* GetTarget();*
* }*
* }*
* void GetTarget()*
* {*
* if (enemys.Count !=0)*
* {*
* float distance;*
* int targetIndex = 0;*

* for (int i = 0; i < enemys.Count; ++i)*
* {*
_ distance = (enemys .transform.position - towerpos).magnitude;
* float closest = (enemys [0].transform.position - towerpos).magnitude;
if (distance < closest)
{
closest = distance;
targetIndex = i;
targetNumber = targetIndex;
Debug.Log (targetNumber);
}
}
}
}*_

}

-----------------------------------------------------------------------
// script for the bullets
-----------------------------------------------------------------------
using UnityEngine;
using System.Collections;

public class projectile : MonoBehaviour {
* public Transform target;*
* public GameObject tower;*
* public float speed;*
* // Use this for initialization*
* void Start ()*
* {*
* StartCoroutine(die());*

* basicTower BT = tower.gameObject.GetComponent ();*
* target = BT.CurrentTarget.transform;*
* if (BT.targetNumber == 0)*
* {*
* Destroy(gameObject);*
* }*

* }*

* void Update ()*
* {*
_ float step = speed * Time.deltaTime;
* transform.position = Vector3.MoveTowards(transform.position, target.position, step);
}*_

* IEnumerator die ()*
* {*
* yield return new WaitForSeconds (1f);*
* Destroy(gameObject);*

* }*

* void OnTriggerEnter(Collider other)*
* {*
* if (other.tag == “EnemyR”||other.tag== “EnemyB”)*
* {*
* Destroy(gameObject);*

* }*

* }*
}

I think your OutOfRange exception happens in your GetTarget method. Try to refactor it like this:

void GetTarget()
    {
        if(!enemys.Any())
        {
           target = false;
           targetNumber = -1;
           return;
        }

        float distance;
        float closest = (enemys[0].transform.position - towerpos).magnitude;
        Debug.Log ("closest " + closest);
        int targetIndex = 0;
 
        for(int i = 0; i < enemys.Count; ++i)
        {
            distance = (enemys*.transform.position - towerpos).magnitude;*

if (distance < closest)
{
closest = distance;
targetIndex = i;
targetNumber = targetIndex;
}

}
}

For the “[new] towers wont shoot first enemy in array. edit : new code.” problem.
Your error appears to be in this code:

if (targetNumber >0)
{
 
CurrentTarget = enemys[targetNumber].transform;
// Debug.Log(CurrentTarget.transform.position);
//transform.LookAt(CurrentTarget.position);
}

If the targetNumber must be bigger than 0 to get the current target, it will never get the index 0 on the array.