Страница 1 из 1

Прошу помощи с оптимизацией корутины

СообщениеДобавлено: 29 окт 2020, 13:36
Spellcaster
Доброго времени суток.

Помогите, пожалуйста, разобраться с кусочком кода:

Синтаксис:
Используется csharp
    IEnumerator UnitsSpavner()
    {
        while (unitsToSpawn.Count > 0)
        {
            int randomUnit = Random.Range(0, unitsToSpawn.Count);
            int unitID = unitsToSpawn[randomUnit];
            unitsToSpawn.Remove(unitsToSpawn[randomUnit]);
            GameObject unit = Instantiate(unitPref, points[0].transform.position, Quaternion.identity);
            unit.GetComponent<Unit>().SetValues(unitID);
            units.Add(unit);
            yield return new WaitForSeconds(unitInterval);
        }
   }


Это спавнер юнитов в моем учебном проекте tower defense.

Один человек был весьма любезен и не поленился сообщить мне, что это плохое решение, поскольку "вызывать GetComponent в корутинах нельзя". К сожалению, он не объяснил, почему именно этого делать нельзя и как делать надо.

Я понимаю, что GetComponent - это тяжелый метод. Я думала, что поскольку я вызываю его не каждый кадр, а один раз в секунду (это значение переменной unitInterval), то так можно. Очевидно, у меня еще мало опыта и я чего-то не понимаю. (

Буду очень признательна тем, кто объяснит мне, как это сделать лучше.

Re: Прошу помощи с оптимизацией корутины

СообщениеДобавлено: 29 окт 2020, 14:00
waruiyume
Вы либо неправильно поняли, либо благодетель в лужу перднул.
Да это тяжёлая функция, но во многих случаях, при коллизиях, например, без неё никак не обойтись. В вашем примере это непринципиально. В данном случае можно поменять тип unitsToSpawn на коллекцию/массив Unit, и вообще не использовать GetComponent(Instantiate компонента спавнит геймобъект, со всеми прицепленными к нему компонентами и возвращает ссылку на инстанс компонета используемого в первом параметре). Если можно что-то не использовать, то, в случае, если не надо писать километр костылей, его лучше не использовать.

Re: Прошу помощи с оптимизацией корутины

СообщениеДобавлено: 29 окт 2020, 16:32
Spellcaster
waruiyume


Спасибо Вам за ответ!

Касаемо, не использования GetComponent, дело такое: у меня один универсальный префаб юнита. После спавна на нем как-то нужно вызвать метод, который заполнит все характеристики этого юнита. Характеристики берутся из csv файла. ID юнита соответствует строке данных в csv файле.

Тут я никак не могу придумать, как обойтись без GetComponent.

Уже думала о том, чтобы для каждого типа юнита создавать отдельный префаб и в нем сразу же заполнять характеристики, но мне не хватает пока опыта и знаний, чтобы понять, будет ли это хорошим решением.

Re: Прошу помощи с оптимизацией корутины

СообщениеДобавлено: 29 окт 2020, 17:24
Xtir
Вы объявляете массив вот так: GameObject[] unitsToSpawn.
А что мешает сделать вот так: Unit[] unitsToSpawn? Тогда и не надо будет вызывать GetComponent каждый раз.
Ну и соответственно префаб тоже поменять на Unit.

Re: Прошу помощи с оптимизацией корутины

СообщениеДобавлено: 29 окт 2020, 22:47
Spellcaster
Xtir писал(а):Вы объявляете массив вот так: GameObject[] unitsToSpawn.
А что мешает сделать вот так: Unit[] unitsToSpawn? Тогда и не надо будет вызывать GetComponent каждый раз.
Ну и соответственно префаб тоже поменять на Unit.


Ух ты! Слона-то я и не заметил! ))
Спасибо огромное! Так и сделаю.