Да не Пакс, не в этом дело, я просто привык делать так чтобы не делать доп. проверок, это только доп. нагрузка для проца.
Ну раз нет других способов, так нет.
Написал не реалтайме чтоб проверял, а только тогда, когда переменная isNeedLODList == true
LODController
using UnityEngine;
using System.Collections;
public class LODController : MonoBehaviour {
public static LOD[] allLOD;
public static int LODCount;
public static int checker, cycleChecker;
public static bool isNeedLODList;
void Start ()
{
GetLODList();
}
void Update ()
{
if (isNeedLODList == false)
{
for (int i=1; i<=cycleChecker; i++)
{
if (checker<LODCount)
{
allLOD[checker].SetLOD();
checker++;}
else {checker=0;
}
}
}
else
{
GetLODList();
}
}
public static void GetLODList()
{
int QL = QualitySettings.GetQualityLevel() + 1;
allLOD = (LOD[])FindObjectsOfType(typeof(LOD));
LODCount = allLOD.Length;
cycleChecker = 1 + (int)Mathf.FloorToInt((float)LODCount/40f)*QL;
if (isNeedLODList == true)
{
bool error = false;
foreach (LOD l in allLOD)
{
if (l == null) {error = true;} else {isNeedLODList = false;}
}
if (error) {allLOD = (LOD[])FindObjectsOfType(typeof(LOD));}
}
}
}
сам LOD

public float hiPolyDistance, midPolyDistance;
public float autoFadeDistance;
private float distance;
private byte LODLevel, currentLODLevel;
private Camera thisCamera;
void Start ()
{
LODController.GetLODList();
LODLevel = 0;
if (hiPolyPrefab != null) {LODLevel++;}
if (midPolyPrefab != null) {LODLevel++;}
if (lowPolyPrefab != null) {LODLevel++;}
if (LODLevel == 1) {gameObject.GetComponent<LOD>().enabled = false;}
if (LODLevel == 2)
{
if (hiPolyPrefab == null) {hiPolyPrefab = midPolyPrefab; midPolyPrefab = null;}
if (midPolyPrefab == null) {midPolyPrefab = lowPolyPrefab; lowPolyPrefab = null;}
}
if (manualSettings == false)
{
float qual = (float)QualitySettings.GetQualityLevel();
hiPolyDistance = 4f + qual * 1.2f;
midPolyDistance = 30f + qual * 5f;
autoFadeDistance = 60f + qual * 10f;
}
thisCamera = Camera.main;
}
void OnDestroy()
{
// LODController.GetLODList();
// print ("LOD destroied");
LODController.isNeedLODList = true;
}
public void SetLOD()
{
distance = Vector3.Distance(transform.position, thisCamera.transform.position);
if (LODLevel == 2)
{
if (currentLODLevel != 1)
{
if (distance < hiPolyDistance)
{currentLODLevel = 1;
GetComponent<MeshFilter>().sharedMesh = hiPolyPrefab.GetComponent<MeshFilter>().sharedMesh;
renderer.sharedMaterial = hiPolyPrefab.renderer.sharedMaterial;
return;
}
}
if (currentLODLevel!= 2)
{
if (distance> hiPolyDistance)
{currentLODLevel =2;
GetComponent<MeshFilter>().sharedMesh = midPolyPrefab.GetComponent<MeshFilter>().sharedMesh;
renderer.sharedMaterial = midPolyPrefab.renderer.sharedMaterial;
return;
}
}
}
if (LODLevel == 3)
{
if (currentLODLevel != 1)
{
if (distance < hiPolyDistance)
{currentLODLevel = 1;
GetComponent<MeshFilter>().sharedMesh = hiPolyPrefab.GetComponent<MeshFilter>().sharedMesh;
renderer.sharedMaterial = hiPolyPrefab.renderer.sharedMaterial;
return;
}
}
if (currentLODLevel!= 2)
{
if (distance> hiPolyDistance && distance< midPolyDistance)
{currentLODLevel =2;
GetComponent<MeshFilter>().sharedMesh = midPolyPrefab.GetComponent<MeshFilter>().sharedMesh;
renderer.sharedMaterial = midPolyPrefab.renderer.sharedMaterial;
return;
}
}
if (currentLODLevel != 3)
{
if (distance > midPolyDistance)
{currentLODLevel =3;
GetComponent<MeshFilter>().sharedMesh = lowPolyPrefab.GetComponent<MeshFilter>().sharedMesh;
renderer.sharedMaterial = lowPolyPrefab.renderer.sharedMaterial;
return;
}
}
}
if (distance > autoFadeDistance) {renderer.enabled = false;} else {renderer.enabled = true;}
}
}
Хотя может я слишком помешан на оптимизации...
Критику буду рад слышать.
Это мой LOD скрипт для free версии
