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

Раздел, посвящённый самому важному - скорости.

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

Сообщение Spellcaster 29 окт 2020, 13:36

Доброго времени суток.

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

Синтаксис:
Используется 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), то так можно. Очевидно, у меня еще мало опыта и я чего-то не понимаю. (

Буду очень признательна тем, кто объяснит мне, как это сделать лучше.
Аватара пользователя
Spellcaster
UNец
 
Сообщения: 7
Зарегистрирован: 24 сен 2020, 09:25

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

Сообщение waruiyume 29 окт 2020, 14:00

Вы либо неправильно поняли, либо благодетель в лужу перднул.
Да это тяжёлая функция, но во многих случаях, при коллизиях, например, без неё никак не обойтись. В вашем примере это непринципиально. В данном случае можно поменять тип unitsToSpawn на коллекцию/массив Unit, и вообще не использовать GetComponent(Instantiate компонента спавнит геймобъект, со всеми прицепленными к нему компонентами и возвращает ссылку на инстанс компонета используемого в первом параметре). Если можно что-то не использовать, то, в случае, если не надо писать километр костылей, его лучше не использовать.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение Spellcaster 29 окт 2020, 16:32

waruiyume


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

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

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

Уже думала о том, чтобы для каждого типа юнита создавать отдельный префаб и в нем сразу же заполнять характеристики, но мне не хватает пока опыта и знаний, чтобы понять, будет ли это хорошим решением.
Аватара пользователя
Spellcaster
UNец
 
Сообщения: 7
Зарегистрирован: 24 сен 2020, 09:25

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

Сообщение Xtir 29 окт 2020, 17:24

Вы объявляете массив вот так: GameObject[] unitsToSpawn.
А что мешает сделать вот так: Unit[] unitsToSpawn? Тогда и не надо будет вызывать GetComponent каждый раз.
Ну и соответственно префаб тоже поменять на Unit.
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

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

Сообщение Spellcaster 29 окт 2020, 22:47

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


Ух ты! Слона-то я и не заметил! ))
Спасибо огромное! Так и сделаю.
Аватара пользователя
Spellcaster
UNец
 
Сообщения: 7
Зарегистрирован: 24 сен 2020, 09:25


Вернуться в Оптимизация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3