Синтаксис:
Используется 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);
}
}
}
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 метров корутина будет считать дистанцию раз в секунду.
Можно ли сделать скрипт еще быстрее? Делимся идеями .....
На данный момент смущает количество корутин, которое будет при больших количествах объектов. Корутина, насколько я понимаю - запускает параллельный поток. Много потоков = плохо.