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

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

СообщениеДобавлено: 06 июн 2011, 22:28
yursiv
Собственно скрипт

Синтаксис:
Используется 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 метров корутина будет считать дистанцию раз в секунду.
Можно ли сделать скрипт еще быстрее? Делимся идеями .....

На данный момент смущает количество корутин, которое будет при больших количествах объектов. Корутина, насколько я понимаю - запускает параллельный поток. Много потоков = плохо.

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

СообщениеДобавлено: 08 июн 2011, 18:27
yursiv
Апдейт
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

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

СообщениеДобавлено: 09 июн 2011, 10:31
Neodrop
Намекну : OnWillRenderObject и OnBecameVisible (Invisible)

Думай. :-?

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

СообщениеДобавлено: 10 июн 2011, 18:05
yursiv
Neodrop писал(а):Намекну : OnWillRenderObject и OnBecameVisible (Invisible)

Думай. :-?


А какое преимущество OnBecameVisible над OnEnable в данном случае ..... ну и вообще?

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

СообщениеДобавлено: 10 июн 2011, 18:13
Neodrop
Я же сказал - думай, а не только в голову кушай.
Намекну ещё раз - ничерта ты не понял, мил друг. Думай есчо. (popcorn)