Показать сообщение отдельно
Старый 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 checkercycleChecker;
    public static 
bool isNeedLODList;
void Start () 
    {
    
GetLODList();
    }
    

void Update () 
    {
    if (
isNeedLODList == false)
        {
        for (
int i=1i<=cycleCheckeri++)    
            {
            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 + (int)Mathf.FloorToInt((float)LODCount/40f)*QL;
    
    if (
isNeedLODList == true)
        {
        
bool error false;
        foreach (
LOD l in allLOD)
            {
            if (
== null) {error true;}  else {isNeedLODList false;}
            }
            if (
error) {allLOD = (LOD[])FindObjectsOfType(typeof(LOD));}
        }
    }
        




сам LOD

public float     hiPolyDistancemidPolyDistance;
    public 
float     autoFadeDistance;
    private 
float     distance;
    private 
byte     LODLevelcurrentLODLevel;
    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 midPolyPrefabmidPolyPrefab null;}
        if (
midPolyPrefab == null) {midPolyPrefab lowPolyPrefablowPolyPrefab 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.positionthisCamera.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 (
distancehiPolyDistance)
                {
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 (
distancehiPolyDistance && distancemidPolyDistance)
                {
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)
 
Ответить с цитированием