@UnityNewPlayer

Как в юнити определить, что GameObject был уничтожен, чтобы исключить взаимодействие с ним?

В игре постоянно должны спавнится клоны врагов и клоны союзников
Делаю ИИ врага и как только он уничтожает союзника выпадает ошибка: MissingReferenceException: The object of type 'GameObject' 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.
Пробовал проверку на null, но не помогает
public class EnemyAI : MonoBehaviour {

	public float speed;
	public float mSpeed;
	private float waitTime;
	public float StartWaitTime;

	float angle;
	float mvalue;
	float slopvalue;

	float rotZ;
	public float rotationOffset;

	public GameObject bullet;
	public Transform firePoint;
	public float intervalpershoot;
	private float updatetime;

	public bool Agressive = false;

	GameObject[] friend;
	GameObject closest;

	public float MaxSpread;
	public float MinSpread;
	void Start()
	{
		friend = GameObject.FindGameObjectsWithTag("Friend"); 

		waitTime = StartWaitTime;
	}

	void Update() {

		updatetime -= Time.deltaTime;

		if (waitTime <= 0)
		{
			angle = Random.Range(-360, 360);
			mvalue = Random.Range(0, 2);
			slopvalue = Random.Range(1, 3);
			waitTime = StartWaitTime;
		}
		else
		{
			waitTime -= Time.deltaTime;
		}

		if (Agressive == true)
		{
			var near = FindClosest();

			Vector3 difference = near.transform.position - transform.position;
			rotZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;

			Quaternion rotation = Quaternion.AngleAxis(rotZ + rotationOffset, Vector3.forward);
			transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * speed);
		}
		
		if (mvalue == 1 && Agressive == false)  
		{
			transform.Translate(-Vector2.left * mSpeed * Time.deltaTime);
		}
		else if (Agressive == false)
		{
			Quaternion Rot = Quaternion.Euler(0, 0, angle);

			transform.rotation = Quaternion.Slerp(transform.rotation, Rot, Time.deltaTime * speed);
		}
	}
	void Slope()
	{
		if (slopvalue == 1 && Agressive == true)
		{
			transform.Translate(Vector2.up * mSpeed * Time.deltaTime);
		}
		else if (slopvalue == 2 && Agressive == true)
		{
			transform.Translate(-Vector2.up * mSpeed * Time.deltaTime);
		}
	}
	void Shoot()
	{
		if (updatetime <= 0f)
		{
			var rotationY = Quaternion.AngleAxis(Random.Range(MinSpread, MaxSpread), transform.up);
			var rotationX = Quaternion.AngleAxis(Random.Range(MinSpread, MaxSpread), transform.right);

			var bruh = rotationX * rotationY;
			var bruh2 = rotationY * rotationX;

			Instantiate(bullet, firePoint.position, firePoint.rotation * bruh * bruh2);

			updatetime = intervalpershoot;
		}
	}
	void OnTriggerEnter2D()
	{
		Agressive = true;
	}

	void OnTriggerExit2D()
	{
		Agressive = false;
	}

	GameObject FindClosest()
	{
			float dist = Mathf.Infinity;
			Vector3 pos = transform.position;
			foreach (GameObject go in friend)
			{
				Vector3 diff = go.transform.position - pos; //ошибка указывает сюда
				float curDis = diff.sqrMagnitude;
				if (curDis < dist)
				{
					closest = go;
					dist = curDis;
				}
			}
		
		return closest;
	}
}
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
twobomb
@twobomb
Ну вы пытаетесь получить доступ к уничтоженному gameobject, значит либо вам нужно при уничтожении удалять его из массива friend, либо может помочь получать этот массив каждый раз, возможно оно не будет искать удаленные типа такого
...
    friend = GameObject.FindGameObjectsWithTag("Friend"); 
      foreach (GameObject go in friend)
....
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы