Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity

Unity Мультиплатформенный инструмент для разработки игр

Ответ
 
Опции темы
Старый 18.03.2013, 09:58   #991
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Фак по Юнити.

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

А пример с int переменной не катит, это тип значения, а не ссылочный тип потому что int[] myIntArray = new int[100500]; выделит память сразу.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
burovalex (18.03.2013)
Старый 19.03.2013, 12:54   #992
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

Хотел получить список всех компонентов LOD (ручной скрипт)

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

Подскажите что сделать.
И вообще нормальный ли это вариант, или лучше находить ГаймОбжекты и у них уже вызывать GetComponent<T>()
Но не знаю как найти ГО с определенным компонентом.
Через тэги пока только умею
__________________
(Offline)
 
Ответить с цитированием
Старый 19.03.2013, 13:26   #993
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Фак по Юнити.

1. Наверное все же FindObjectsOfType?
2. Опять приведение типов. Смотрите внимательнее мануал. Что возвращает эта функция? Object[]! Естественно в Object нет Ваших переменных. Приведите результат к типу LOD - все будет работать.
LOD[] allLOD = (LOD[]) FindObjectsOfType(typeof(LOD));
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
burovalex (19.03.2013)
Старый 19.03.2013, 14:13   #994
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

Спасибо Симен!
А FindObjectsOfType будет выбирать объекты только текущей сцены?
Я увидел что есть FindSceneObjectsOfType вот и подумал что она мне нужна )
__________________
(Offline)
 
Ответить с цитированием
Старый 19.03.2013, 17:15   #995
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Фак по Юнити.

FindSceneObjectsOfType недокументирована, потому я бы не использовал.
будет выбирать объекты только текущей сцены
Только активные объекты. Посему, естественно только текущей сцены.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
burovalex (19.03.2013)
Старый 19.03.2013, 17:31   #996
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

Сейчас еще наткнулся на такую загвоздку.

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

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

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


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

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

Т.е. вот так не канает
А еще подскажите, плохо ли что я использую статичные переменные и методы в Собирающем скрипте, при условии что на всю сцену у меня их будет по одному
__________________
(Offline)
 
Ответить с цитированием
Старый 19.03.2013, 17:32   #997
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Фак по Юнити.

сравнить объект с null перед обработкой не пробовал?

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

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

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 19.03.2013, 17:46   #998
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

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

Может есть еще варианты?
__________________
(Offline)
 
Ответить с цитированием
Старый 19.03.2013, 18:11   #999
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Фак по Юнити.

null обработать другим способом нельзя. можешь вместо continue поставить лог, что null попался.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 20.03.2013, 18:16   #1001
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

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

Мне вообще это надо для отображения рисунков одинакового размера, при условии что сама текстура может быть разными размерами.
Подскажите плиз как ограничить размер текстуры, желательно через Rect параметр для скрипта.
__________________
(Offline)
 
Ответить с цитированием
Старый 20.03.2013, 18:19   #1002
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Фак по Юнити.

Немного непонятен вопрос, вот это подойдет?
http://docs.unity3d.com/Documentatio...TexCoords.html
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.03.2013, 21:31   #1003
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

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

Посоветуйте, стоит ли пользоваться GUILayout? Либо чтото другое.
И в справке не могу найти (раньше натыкался), можно создать какуюто типо Area, в которой координаты свои, т.е. внутренние элементы дочерние с локальными координатами. Не знаете что за элемент?
__________________
(Offline)
 
Ответить с цитированием
Старый 20.03.2013, 22:01   #1004
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений
(для 60 пользователей)
Ответ: Фак по Юнити.

Мне ГуиЛайоут нравится только тем что не надо расчитывать размеры каждого элемента
__________________
(Offline)
 
Ответить с цитированием
Старый 21.03.2013, 04:21   #1005
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Фак по Юнити.

Объясни предметно с рисунками что ты хочешь сделать, иначе хз как помочь. Я не понял проблемы. Но одно могу сказать точно - GUI в GUILayout не всегда можно использовать нормально, особенно простое рисование текстуры.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com