Показать сообщение отдельно
Старый 19.03.2013, 18:26   #1000
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

Да не Пакс, не в этом дело, я просто привык делать так чтобы не делать доп. проверок, это только доп. нагрузка для проца.
Ну раз нет других способов, так нет.
Написал не реалтайме чтоб проверял, а только тогда, когда переменная 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 версии
__________________
(Offline)
 
Ответить с цитированием