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);*
* }*
* }*
}