Unity пытается найти обьект, но он удалён
я новичок. Я создаю игру на прохождение уровней. При прохождении уровня я генерирую новую сцену при помощи SceneManager.LoadScene(1);.
Всё работает до того момента как генерируется новая сцена.
Далее Unity выводит такую ошибку:
MissingReferenceException: The object of type 'Rigidbody' 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.
UnityEngine.Rigidbody.AddRelativeForce (UnityEngine.Vector3 force, UnityEngine.ForceMode mode) (at <fbf411079f9349af9d7283cbbd3a7c7c>:0)
UnityEngine.Rigidbody.AddRelativeForce (UnityEngine.Vector3 force) (at <fbf411079f9349af9d7283cbbd3a7c7c>:0)
Cube.Move (UnityEngine.Vector3 direction) (at Assets/Scripts/Cube.cs:45)
Cube.OnSwipe (UnityEngine.Vector2 direction) (at Assets/Scripts/Cube.cs:28)
SwipeDetection.CheckSwipe () (at Assets/Scripts/SwipeDetection.cs:74)
SwipeDetection.Update () (at Assets/Scripts/SwipeDetection.cs:52)
Я её понимаю, но не знаю как исправить. Подскажите пожалуйста, что следует мне сделать? Заранее спасибо!
using UnityEngine;
using UnityEngine.SceneManagement;
public class Cube : MonoBehaviour
{
public float ForceValue;
private Rigidbody rb;
void Start()
{
Physics.gravity = new Vector3(0, -20, 0);
rb = GetComponent<Rigidbody>();
SwipeDetection.SwipeEvent += OnSwipe;
}
private void OnSwipe(Vector2 direction)
{
Vector3 dir =
direction == Vector2.up ? Vector3.forward :
direction == Vector2.down ? Vector3.back : (Vector3)direction;
Move(dir);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
Move(Vector3.left);
else if (Input.GetKeyDown(KeyCode.D))
Move(Vector3.right);
else if (Input.GetKeyDown(KeyCode.W))
Move(Vector3.forward);
else if (Input.GetKeyDown(KeyCode.S))
Move(Vector3.back);
}
private void Move(Vector3 direction)
{
rb.AddRelativeForce(direction * ForceValue);
}
private void OnTriggerEnter(Collider other)
{
if (this.CompareTag("Player") && other.CompareTag("Finish"))
{
SceneManager.LoadScene(1);
}
}
}
Ответы (1 шт):
Не совсем Unity пытается найти объект, а скорее вы.
Вы ведь подписались в методе Start класса Cube на событие SwipeEvent:
SwipeDetection.SwipeEvent += OnSwipe;
Куб был уничтожен, но подписка осталось.
Так что вам просто нужно, что бы куб отписывался от события при своем уничтожении. У MonoBehaviour есть подходящий метод OnDestroy:
void OnDestroy()
{
SwipeDetection.SwipeEvent -= OnSwipe;
}
В целом, хорошая практика - одновременно с моментом написания кода подписки, сразу писать код отписки в методе, вызываемом при уничтожении/деактивации/выключении сущности.