forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Unity (http://forum.boolean.name/forumdisplay.php?f=144)
-   -   Фак по Юнити. (http://forum.boolean.name/showthread.php?t=12966)

pax 18.03.2013 09:58

Ответ: Фак по Юнити.
 
Ну а нафига тебе выделять память сразу под все элементы массива? Вдруг ты используешь всего 1 элемент из десяти? Не забывай что это массив ссылок на экземпляры класса, а не массив значений. Если экземпляра нет, то это null. Все четко и ясно.

А пример с int переменной не катит, это тип значения, а не ссылочный тип ;) потому что int[] myIntArray = new int[100500]; выделит память сразу.

burovalex 19.03.2013 12:54

Ответ: Фак по Юнити.
 
Хотел получить список всех компонентов LOD (ручной скрипт)

написал
allLOD = Object.FindSceneObjectsOfType(typeof(LOD));
но таким образом не могу к нему обратиться, хотя в инспекторе вижу список вытянутых скриптов
т.е. allLOD[i]. не подсвечиваются внутренние переменные.

Подскажите что сделать.
И вообще нормальный ли это вариант, или лучше находить ГаймОбжекты и у них уже вызывать GetComponent<T>()
Но не знаю как найти ГО с определенным компонентом.
Через тэги пока только умею :rolleyes:

seaman 19.03.2013 13:26

Ответ: Фак по Юнити.
 
1. Наверное все же FindObjectsOfType?
2. Опять приведение типов. Смотрите внимательнее мануал. Что возвращает эта функция? Object[]! Естественно в Object нет Ваших переменных. Приведите результат к типу LOD - все будет работать.
Код:

LOD[] allLOD = (LOD[]) FindObjectsOfType(typeof(LOD));

burovalex 19.03.2013 14:13

Ответ: Фак по Юнити.
 
Спасибо Симен!
А FindObjectsOfType будет выбирать объекты только текущей сцены?
Я увидел что есть FindSceneObjectsOfType вот и подумал что она мне нужна )

seaman 19.03.2013 17:15

Ответ: Фак по Юнити.
 
FindSceneObjectsOfType недокументирована, потому я бы не использовал.
Цитата:

будет выбирать объекты только текущей сцены
Только активные объекты. Посему, естественно только текущей сцены.

burovalex 19.03.2013 17:31

Ответ: Фак по Юнити.
 
Сейчас еще наткнулся на такую загвоздку.

Есть скрипт, который собирает все объекты по тэгу и обновляет их.
И не получается удалить объект без Null Reference, т.е. скрипт кричит что объекта уже нету.

Пытался обновить список объектов в OnDestroy(), но получается что я запрашиваю список перед удалением, и соответственно удаляемый объект оказывается в этом списке и приводит к ошибке.

Подскажите плиз как избавиться от бага
Может можно как то вызывать некоторые функции в последнюю очередь?


/// собирающий скрипт
public static void GetPlantList()
{
allPlant = GameObject.FindGameObjectsWithTag("Plant");
plantCount = allPlant.Length;
}

///скрипт объекта
void OnDestroy()
{
if (GetComponent<LOD>() == null) {LODController.GetLODList();}
}

Т.е. вот так не канает
А еще подскажите, плохо ли что я использую статичные переменные и методы в Собирающем скрипте, при условии что на всю сцену у меня их будет по одному

pax 19.03.2013 17:32

Ответ: Фак по Юнити.
 
сравнить объект с null перед обработкой не пробовал?

PHP код:

foreach(MyObject obj in MyObjects)
{
   if(
obj == null) continue;

   
// тут обработка



burovalex 19.03.2013 17:46

Ответ: Фак по Юнити.
 
Ну такая проверка имеет две стороны медали
С одной стороны так ошибок точно не будет.
С другой стороны лишнее вычисление и не будет ошибок, когда они могут тебе подсказать.

Может есть еще варианты?

pax 19.03.2013 18:11

Ответ: Фак по Юнити.
 
null обработать другим способом нельзя. можешь вместо continue поставить лог, что null попался.

burovalex 19.03.2013 18:26

Ответ: Фак по Юнити.
 
Да не Пакс, не в этом дело, я просто привык делать так чтобы не делать доп. проверок, это только доп. нагрузка для проца.
Ну раз нет других способов, так нет.
Написал не реалтайме чтоб проверял, а только тогда, когда переменная isNeedLODList == true

LODController

PHP код:

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

PHP код:

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 версии :)

burovalex 20.03.2013 18:16

Ответ: Фак по Юнити.
 
Блин, чтото с гуи парюсб парюсь. И не получается.
Подскажите как можно сделать область, в которой размер содержимого менялся в зависимости от размера области.
Пробовал Areа - за её пределы спокойно выходят рисунки.

Мне вообще это надо для отображения рисунков одинакового размера, при условии что сама текстура может быть разными размерами.
Подскажите плиз как ограничить размер текстуры, желательно через Rect параметр для скрипта.

pax 20.03.2013 18:19

Ответ: Фак по Юнити.
 
Немного непонятен вопрос, вот это подойдет?
http://docs.unity3d.com/Documentatio...TexCoords.html

burovalex 20.03.2013 21:31

Ответ: Фак по Юнити.
 
Да Пакс, это то, только проблема в том что я использовал GUILayout, в котором объекты автоматом располагаются.
И в этом Layout пытался картинку вставить, с custom style и настроенным width height, но както коряво смотрится.

Посоветуйте, стоит ли пользоваться GUILayout? Либо чтото другое.
И в справке не могу найти (раньше натыкался), можно создать какуюто типо Area, в которой координаты свои, т.е. внутренние элементы дочерние с локальными координатами. Не знаете что за элемент?

burovalex 20.03.2013 22:01

Ответ: Фак по Юнити.
 
Мне ГуиЛайоут нравится только тем что не надо расчитывать размеры каждого элемента

pax 21.03.2013 04:21

Ответ: Фак по Юнити.
 
Объясни предметно с рисунками что ты хочешь сделать, иначе хз как помочь. Я не понял проблемы. Но одно могу сказать точно - GUI в GUILayout не всегда можно использовать нормально, особенно простое рисование текстуры.


Часовой пояс GMT +4, время: 02:37.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot