 |
Unity Мультиплатформенный инструмент для разработки игр |
18.03.2013, 09:58
|
#991
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Ну а нафига тебе выделять память сразу под все элементы массива? Вдруг ты используешь всего 1 элемент из десяти? Не забывай что это массив ссылок на экземпляры класса, а не массив значений. Если экземпляра нет, то это null. Все четко и ясно.
А пример с int переменной не катит, это тип значения, а не ссылочный тип  потому что int[] myIntArray = new int[100500]; выделит память сразу.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.03.2013, 12:54
|
#992
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Фак по Юнити.
Хотел получить список всех компонентов LOD (ручной скрипт)
написал
allLOD = Object.FindSceneObjectsOfType(typeof(LOD));
но таким образом не могу к нему обратиться, хотя в инспекторе вижу список вытянутых скриптов
т.е. allLOD[i]. не подсвечиваются внутренние переменные.
Подскажите что сделать.
И вообще нормальный ли это вариант, или лучше находить ГаймОбжекты и у них уже вызывать GetComponent<T>()
Но не знаю как найти ГО с определенным компонентом.
Через тэги пока только умею 
__________________
|
(Offline)
|
|
19.03.2013, 13:26
|
#993
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Фак по Юнити.
1. Наверное все же FindObjectsOfType?
2. Опять приведение типов. Смотрите внимательнее мануал. Что возвращает эта функция? Object[]! Естественно в Object нет Ваших переменных. Приведите результат к типу LOD - все будет работать.
LOD[] allLOD = (LOD[]) FindObjectsOfType(typeof(LOD));
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.03.2013, 14:13
|
#994
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Фак по Юнити.
Спасибо Симен!
А FindObjectsOfType будет выбирать объекты только текущей сцены?
Я увидел что есть FindSceneObjectsOfType вот и подумал что она мне нужна )
__________________
|
(Offline)
|
|
19.03.2013, 17:15
|
#995
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Фак по Юнити.
FindSceneObjectsOfType недокументирована, потому я бы не использовал.
будет выбирать объекты только текущей сцены
|
Только активные объекты. Посему, естественно только текущей сцены.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.03.2013, 17:31
|
#996
|
Разработчик
Регистрация: 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
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
сравнить объект с null перед обработкой не пробовал?
foreach(MyObject obj in MyObjects) { if(obj == null) continue;
// тут обработка }
|
(Offline)
|
|
19.03.2013, 17:46
|
#998
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Фак по Юнити.
Ну такая проверка имеет две стороны медали
С одной стороны так ошибок точно не будет.
С другой стороны лишнее вычисление и не будет ошибок, когда они могут тебе подсказать.
Может есть еще варианты?
__________________
|
(Offline)
|
|
19.03.2013, 18:11
|
#999
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
null обработать другим способом нельзя. можешь вместо continue поставить лог, что null попался.
|
(Offline)
|
|
19.03.2013, 18:26
|
#1000
|
Разработчик
Регистрация: 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)
|
|
20.03.2013, 18:16
|
#1001
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Фак по Юнити.
Блин, чтото с гуи парюсб парюсь. И не получается.
Подскажите как можно сделать область, в которой размер содержимого менялся в зависимости от размера области.
Пробовал Areа - за её пределы спокойно выходят рисунки.
Мне вообще это надо для отображения рисунков одинакового размера, при условии что сама текстура может быть разными размерами.
Подскажите плиз как ограничить размер текстуры, желательно через Rect параметр для скрипта.
__________________
|
(Offline)
|
|
20.03.2013, 18:19
|
#1002
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
|
(Offline)
|
|
20.03.2013, 21:31
|
#1003
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Фак по Юнити.
Да Пакс, это то, только проблема в том что я использовал GUILayout, в котором объекты автоматом располагаются.
И в этом Layout пытался картинку вставить, с custom style и настроенным width height, но както коряво смотрится.
Посоветуйте, стоит ли пользоваться GUILayout? Либо чтото другое.
И в справке не могу найти (раньше натыкался), можно создать какуюто типо Area, в которой координаты свои, т.е. внутренние элементы дочерние с локальными координатами. Не знаете что за элемент?
__________________
|
(Offline)
|
|
20.03.2013, 22:01
|
#1004
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Фак по Юнити.
Мне ГуиЛайоут нравится только тем что не надо расчитывать размеры каждого элемента
__________________
|
(Offline)
|
|
21.03.2013, 04:21
|
#1005
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Объясни предметно с рисунками что ты хочешь сделать, иначе хз как помочь. Я не понял проблемы. Но одно могу сказать точно - GUI в GUILayout не всегда можно использовать нормально, особенно простое рисование текстуры.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:35.
|