Хорошо, во-первых, я не уверен, что добавил правильный заголовок к этому вопросу, если вы думаете, что это может сбивать с толку, я его изменю.
В сцене у меня есть LevelManager, который появляется три экземпляра одного и того же объекта с помощью Instantiate. Для созданных объектов есть сценарий, написанный ниже. Первый и второй объекты только создаются, а третий кэшируется и сразу после того, как LevelManager вызывает функцию IsNowCorrect
:
public class LevelManagerValuesUpdater : MonoBehaviour
{
ShapeMatch_LevelManager _levelManager;
Transform _transform;
Rigidbody2D _rigidbody;
/*[SerializeField]*/ bool isCorrect = false;
Vector2 position;
float rotation;
public void IsNowCorrect(ShapeMatch_LevelManager levelManager)
{
isCorrect = true;
Debug.Log(gameObject.name + " is correct");
_levelManager = levelManager;
AssignComponents();
}
void AssignComponents()
{
_transform = gameObject.transform;
_rigidbody = GetComponent<Rigidbody2D>();
}
private void Update()
{
if (!isCorrect)
return;
Debug.Log("Update ran");
position = _transform.position;
rotation = _rigidbody.rotation;
_levelManager.UpdateInfo(position, rotation);
}
}
Первая часть скрипта работает нормально. Первый Debug.Log (тот, что находится внутри NowIsCorrect
) вызывается только последним из трех объектов, как и следовало ожидать. Но тогда ни один из трех не запускает второй Debug.Log в функции обновления.
Я попытался добавить [SerializeField]
в переменную isCorrect
, чтобы проверить ее в инспекторе, и вот что произошло: переменная на третий объект был истинным, и первый журнал был вызван один раз (как и раньше), но теперь функция Debug.Log in Update вызывалась всеми тремя объектами. Вдобавок ко всему, теперь я получаю исключение NullReference от всех трех объектов, как будто функция AssignComponents
не вызывается (но если вы поместите внутри нее Debug.Log, похоже, что она вызывается)
Извините, если я упустил что-то тривиальное, но я пока не могу понять это ...