@Div100

Как правильно инициализировать данные в Unity C#?

есть 2 класса
public class GameController : MonoBehaviour {
    public MainDeck deck;

    void Start () {
        GameObject deckRespawn = GameObject.Find("deckRespawn");
        deck = Instantiate(deck, deckRespawn.transform.position, deckRespawn.transform.rotation) as MainDeck;
        
         //здесь я надеялся, что метод start() в MainDeck уже выполнился и очередь заполнилась, попробую 
         // вывести длину очереди
         Debug.Log(deck.Cards.Count); //выводит 0
    }
}

и собственно класс MainDeck
public class MainDeck : MonoBehaviour {
    public Queue<Card> Cards = new Queue<Card>();
    private GameObject[] prefabs;
    private static int DECK_SIZE = 30;
    void Start () {
        prefabs = Resources.LoadAll<GameObject>("cards");
        populateDeck(DECK_SIZE);
    }

    
    private void populateDeck(int deckSize)
    {
        for (int i = 0; i < deckSize; i++)
        {
            Card card = new Card();
            card.damage = Random.Range(0, 100);
            card.health = Random.Range(200, 1000);
            card.id = i;
            card.image = prefabs[Random.Range(0, prefabs.Length)];
            Cards.Enqueue(card);
        }
    }
}


Сам вопрос почему при Instantiate метод start(), работает позже самого вызова Instantiate, то есть как я указал в комменте он выводит длину 0, но тем не менее я проверял, что Очередь заполняется и ее длина 30, но позже. Как мне лучше инициализировать ресурсы в таком случае? Как это делается в unity?
Я конечно уже прочитал про метод awake(), но правильно ли это?
Можно даже пример какой-нибудь кинуть буду рад.

P.S. Сам unity скачал только вчера, да и с C# знакомлюсь наравне с unity, так что если это очевидный вопрос, то ...
  • Вопрос задан
  • 2008 просмотров
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Это как раз тот случай, когда ваш код нужно писать в Awake(), а не в Start(). Awake() запускается сразу после запуска игры (для каждого объекта), потом происходит первоначальная настройка всех объектов, и после этого запускается Start() (опять же - для каждого объекта). Юнити не указывает, в каком порядке будут инициализированы объекты сцены. Поэтому, в Awake() пишите код, связанный с этим самим объектом, а код, связанный с другими объектами, пишите в Start().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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