- Home /
How can I make my player attack enemies without getting errors?
I have been working on a little 2d platformer for a while now and I have run into a serious error that I can't seam to figure out and I haven't been able to find anything with a quick search on google.
I managed to make a script that lets my player attack all enemies inside a radius, but this only works with one enemy. To fix this problem I tried creating a list to store all my enemies in, this worked fine with three enemies, but when I tried setting up a little prototype level with six enemies in it I started getting problems again. I could kill the first enemy just the way I wanted, but when I tried attacking the next enemy I would not hurt him and display the error "MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object." I'm not sure what is wrong since I created a list to take care of this and make sure that it is individual to each enemy. If anyone knows how to fix this I would be very grateful.
Here is the "PlayerAttack" script:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlayerAttack : MonoBehaviour {
public List<Transform> targets;
public GameObject target;
public float attackTimer;
public float coolDown;
void Start () {
targets = new List<Transform> ();
AddAllEnemies ();
attackTimer = 0;
coolDown = 0.3f;
}
public void AddAllEnemies(){
GameObject[] gos = GameObject.FindGameObjectsWithTag("Enemy");
foreach (GameObject enemy in gos)
AddTarget (enemy.transform);
}
public void AddTarget (Transform enemy){
targets.Add (enemy);
}
void Update() {
if (attackTimer > 0) {
attackTimer -= Time.deltaTime;
if (attackTimer < 0){
attackTimer = 0;
}
}
if (Input.GetButtonDown ("z")) {
if (attackTimer == 0) {
Attack();
attackTimer = coolDown;
}
}
}
void Attack() {
foreach(Transform target in targets)
{
float distance = Vector3.Distance (target.transform.position, transform.position);
Debug.Log (distance);
if (distance < 2.6) {
EnemyHealth eh = (EnemyHealth)target.GetComponent ("EnemyHealth");
eh.AddjustCurrentHealth (-5);
}
}
}
}