Okay, so i've been trying to make this code work for a day now, but it's just not working. Whenever i destroy the closest enemy, i want to check for the enemy that is now the closest, but it keeps saying that i'm accessing a transform that has already been destroyed, which is most likely the transform i've just destroyed. However, i can't seem to find where i'm accessing the transform that has already been destroyed in my code. I have narrowed it down somewhat, because the game does execute the enemyToDestroy.SendMessage, but after fiddling around with it a lot, i can't seem to figure out how to make it work. Which is why i'm asking you guys for help.
!!!the transform that appears to be missing is closestEnemy!!!
FINDING CLOSEST ENEMY CODE:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class gameSystems : MonoBehaviour {
public float keyToPress;
public float correctKeys;
public float wrongKeys;
public float timerTime;
public float timeToDisplay;
public List enemyList;
public Transform closestEnemy;
public Transform playerTransform;
public float distanceToClosest;
public float letterMinDistance;
public float tooCloseDistance;
public bool letterGenerated;
public Transform deathPrefab;
void Awake()
{
letterGenerated = false;
playerTransform = GameObject.Find("player").transform;
closestEnemy = null;
enemyList = new List();
AddEnemiesToList();
}
void AddToList(Transform myTransform)
{
enemyList.Add(myTransform);
}
public void AddEnemiesToList()
{
GameObject[] ItemsInList = GameObject.FindGameObjectsWithTag("Enemy");
foreach (GameObject _Enemy in ItemsInList)
{
AddTarget(_Enemy.transform);
}
}
public void AddTarget(Transform enemy)
{
enemyList.Add(enemy);
}
public void DistanceToTarget()
{
enemyList.Sort(delegate(Transform t1, Transform t2)
{
return Vector3.Distance(t1.transform.position, playerTransform.transform.position).CompareTo(Vector3.Distance(t2.transform.position, playerTransform.transform.position));
});
}
public void TargetedEnemy()
{
DistanceToTarget();
closestEnemy = enemyList[0];
}
void Update()
{
if (closestEnemy == null) { TargetedEnemy(); }
if (closestEnemy != null)
{
distanceToClosest = Vector3.Distance(playerTransform.transform.position, closestEnemy.transform.position);
}
if (distanceToClosest <= letterMinDistance && !letterGenerated)
{
keyToPress = Random.Range(1, 27);
letterGenerated = true;
}
if (distanceToClosest <= tooCloseDistance)
{
wrongKeys += 1;
DestroyClosestEnemy();
}
timerTime -= Time.deltaTime;
timeToDisplay = Mathf.Round(timerTime * 10) / 10;
if (wrongKeys < 0) { wrongKeys = 0;}
}
void AddScore()
{
keyToPress = 0;
letterGenerated = false;
correctKeys += 1;
wrongKeys -= 1;
DestroyClosestEnemy();
}
void DestroyClosestEnemy() ///////THIS IS THE VOID WHERE I THINK IT'S GOING WRONG, BECAUSE I'M CERTAIN IT EXECUTES THE SENDMESSAGE
{
GameObject enemyToDestroy = closestEnemy.gameObject;
enemyList.Remove(closestEnemy);
enemyToDestroy.SendMessage("DestroySelf", SendMessageOptions.DontRequireReceiver);
TargetedEnemy();
}
}
Destroying the enemy code:
using UnityEngine;
using System.Collections;
public class enemyMovement : MonoBehaviour {
public float enemyMovementSpeed;
public Transform myTransform;
public Transform deathPrefab;
void Awake()
{
rigidbody.velocity = new Vector3(-enemyMovementSpeed, 0, 0);
myTransform = transform;
GameObject gameSystemsGO = GameObject.Find("gameSystems");
gameSystemsGO.SendMessage("AddToList", myTransform, SendMessageOptions.DontRequireReceiver);
}
void DestroySelf()
{
Instantiate(deathPrefab, myTransform.transform.position, Quaternion.identity);
GameObject.Destroy(gameObject);
}
}
Thank you very much for reading this question, and thanks for your time as well.
↧