@Espleth

Изменение последовательности создания объектов в Unity?

Проблема вот в чем: пусть у нас есть 2 объекта, к одному из них прикреплен такой скрипт
public class GameController : MonoBehaviour
{
    public static GameController Instance;

    public Transform SomeTrasform; // Задается в Editor'e

    private void Start()
    {
        Instance = this;
    }
}

Ко второму такой
public class SomeClass : MonoBehaviour
{
    private void Start()
    {
        Transform someTransform = GameController.Instance.SomeTransform;
    }
}

Проблема в том, что второй объект может создаваться раньше первого, и я получаю NullReferenceException, пытаясь вызвать GameController.Instance. Как это можно обойти? У меня пока 2 варианта:
С помощью корутины отложить создание второго объекта на пол секунды, к примеру. По-моему так себе вариант.
Отказаться от static GameController.Instance, и использовать FindGameObjectWithTag("GameController").GetComponent().SomeTransform; Тут тоже есть свои недостатки, например требуются изменения в коде при переносе скрипта GameController на другой объект и банально не так красиво получается.
  • Вопрос задан
  • 556 просмотров
Решения вопроса 2
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Если вам понадобилось управлять последовательностью стартов, значит пора менять архитектуру. Ваш GameController должен либо инстанцировать объекты с SomeClass, либо инициализировать их, либо ещё как. Почитайте про синглтоны по ссылке ниже.
www.gameprogrammingpatterns.com/singleton.html
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
guriyar
@guriyar
1. Можно для первого объекта вместо Start() использовать Awake()
private void Awake()
 {
        Instance = this;
}

2. Все необходимые вычисления во втором объекте перенести из Start() в Update() типа такого:
public class SomeClass : MonoBehaviour
{
    private bool _inited = false;
    private void MyStart()
    {
        Transform someTransform = GameController.Instance.SomeTransform;
    }

    private void Update()
    {
        if (!_inited)
        {
            MyStart();
            _inited = true;
        }
    }
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы