Лоды на корутинах

Оптимизация кода.

Лоды на корутинах

Сообщение yursiv 06 июн 2011, 22:28

Собственно скрипт

Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;
using System.Collections.Generic;


public class LODManager : MonoBehaviour
{
    public List<GameObject> Lods;
    public List<int> Distances;
    public Transform Target;

    private float _timeStep;
    private int _count;
    private float _distance;

    void Awake()
    {
        _count = Distances.Count;
        _timeStep = 0.02F;
    }

    void Start()
    {
        StartCoroutine(LodHandler());
    }

    IEnumerator LodHandler()
    {
        while (true)
        {
            yield return new WaitForSeconds(_timeStep);

            _distance = Vector3.Distance(Target.position, transform.position);
            SwitchLod(_distance);

            _timeStep = _distance * 0.01F + 0.02F;
        }
    }

    void SwitchLod(float distance)
    {
        if (_distance > Distances[_count - 1])
        {
            foreach (var lod in Lods)
                lod.SetActiveRecursively(false);
        }
        if (_distance < Distances[0])
        {
            for (int j = 0; j < _count; j++)
                Lods[j].SetActiveRecursively(false);
            Lods[0].SetActiveRecursively(true);
        }
        else
            for (int i = _count - 1; i > 0; i--)
                if (_distance < Distances[i] && _distance > Distances[i - 1])
                {
                    for (int j = 0; j < _count; j++)
                        Lods[j].SetActiveRecursively(false);
                    Lods[i].SetActiveRecursively(true);
                }

    }
}
 


Фишка тут :
_timeStep = _distance * 0.01F + 0.02F;

Т.е. при дистанции 100 метров корутина будет считать дистанцию раз в секунду.
Можно ли сделать скрипт еще быстрее? Делимся идеями .....

На данный момент смущает количество корутин, которое будет при больших количествах объектов. Корутина, насколько я понимаю - запускает параллельный поток. Много потоков = плохо.
Аватара пользователя
yursiv
UNIт
 
Сообщения: 130
Зарегистрирован: 09 ноя 2010, 11:51
Откуда: Харьков

Re: Лоды на корутинах

Сообщение yursiv 08 июн 2011, 18:27

Апдейт
LODSystem.unitypackage
Содержит скрипты: LODZone, LODManager, LevelDesignMenus.

LevelDesignMenus - в папку Editor, создает меню с именем LevelDesign - для быстрого присоединения скриптов.

Настраивать так:
1. Выделить лоды(в любой последовательности - команда в меню отсортирует по количеству полигонов - желательно чтобы все модели были разного полигонажа), присоединить к новому ГО(следим чтобы трансформ-компонента была в пространстве в той же позиции что и все лоды), выделяем ГО, LevelDesign->LODManager.
2. Получившийся ГО присоеденить к новому ГО(тоже обратить внимание на положение) и кинуть на него скрипт LODZone(лучше с помощью команды в меню)
3. Настроить в обоих скриптах TARGET по необходимости, дистанции для лодов, дистанцию для LODZone(время апдейта = MinUpdateTime+ Multiplyer*расстояние до ЛОДЗоны).

ГО с лодами ОБЯЗАТЕЛЬНО должен быть внутри ГО со скриптом LODZone.

СУТЬ СИСТЕМЫ
- все лоды спят пока ЛОДЗона находится далеко и включаются на определенной дистанции. Интервалы времени(через которые считается дистанция) меняются как для ЛОДЗоны так и для объектов с лодами и зависят от расстояния до Target. Так например при расстоянии в 1км дистанция в ЛОДЗоне проверяется 1 раз в 4 сек(1000*0.003 + 1) с настройками ЛОДЗоны по дефолту. Для ЛОДОбъектов на дистанции 0 метров - 0.02 сек, 30 метров - 0.3 сек, 100 метров - 1сек(_timeStep = _distance * 0.01F + 0.02F).

В результате должно получиться так:
LODZone.unitypackage
Аватара пользователя
yursiv
UNIт
 
Сообщения: 130
Зарегистрирован: 09 ноя 2010, 11:51
Откуда: Харьков

Re: Лоды на корутинах

Сообщение Neodrop 09 июн 2011, 10:31

Намекну : OnWillRenderObject и OnBecameVisible (Invisible)

Думай. :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Лоды на корутинах

Сообщение yursiv 10 июн 2011, 18:05

Neodrop писал(а):Намекну : OnWillRenderObject и OnBecameVisible (Invisible)

Думай. :-?


А какое преимущество OnBecameVisible над OnEnable в данном случае ..... ну и вообще?
Аватара пользователя
yursiv
UNIт
 
Сообщения: 130
Зарегистрирован: 09 ноя 2010, 11:51
Откуда: Харьков

Re: Лоды на корутинах

Сообщение Neodrop 10 июн 2011, 18:13

Я же сказал - думай, а не только в голову кушай.
Намекну ещё раз - ничерта ты не понял, мил друг. Думай есчо. (popcorn)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт


Вернуться в Код

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

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