forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

seaman 21.01.2013 00:02

Ответ: Вопросы от новичка
 
Цитата:

Тогда как сделать чтобы LookAt направлял к примеру не ось x, а ось z???
Проще всего изначально нормально делать модели в максе/майке/...
Посмотри тут как это нужно делать правильно:
http://gamecreatingcommunity.ru/forum/59-5419-1
ЗЫ: если уж совсем никак не переделать - удочеряй пустому ГО и верти его

seaman 21.01.2013 00:17

Ответ: Вопросы от новичка
 
Цитата:

Что значит ошибка?
У меня такого не было, но инет говорит следующее.
OnGUI за кадр вызывается несколько раз. Если используется Layout, то сначала с событием Event.layout, затем с событиями типа mouseDown. В конце с событием repaint. Если внутри OnGUI используются некие переменные, управляемые извне и вывод GUI зависит от этих переменных, то Юнити боится, что может возникнуть ошибка вывода и выдает сама такую ошибку.
Кода Вашего нет, так что придется разбираться Вам самому - верно это или нет.

WISHMASTER35 21.01.2013 01:32

Ответ: Вопросы от новичка
 
seaman, да там с кодом все странно. Изменяю его в одном месте, а ошибка в другом.
Вот не пойму почему
GUILayoutUtility.GetAspectRect( items.Length, GUILayout.MaxHeight(64) );
Возвращает квадрат с высотой больше, чем 64?

Morganolla 21.01.2013 12:09

Ответ: Вопросы от новичка
 
Вопрос по сохранению игры - каким образом лучше делать сохранение игры для следующих двух вариантов:
1- легкий случай, требуется запомнить только счет и номер уровня ( при загрузке уровень или сцена всегда начинается с начала)
2- тяжелый случай, требуется запоминать положение и состояние объектов на сцене и при загрузке их полностью восстанавливать для продолжения игры с текущего момента.
Что посоветуете?

pax 21.01.2013 12:13

Ответ: Вопросы от новичка
 
1. Самое простое - PlayerPrefs
2. Тут универсального решения нет. Придется что-то свое изобретать.

Morganolla 21.01.2013 12:27

Ответ: Вопросы от новичка
 
Еще вопросик - можно ли делать картинку на мониторе сразу с двух камер: первая камера с перспективной проекцией дает 3Д вид объектов, а вторая камера с орто-проекцией накладывает на этот вид спрайты (окошки) типа карты и т.п. ( возможно с альфа-каналом ) ?

pax 21.01.2013 12:30

Ответ: Вопросы от новичка
 
Да можно. Добавь две камеры в сцену. Настрой их порядок рендеринга (для управления порядком камер используй параметр Depth), второй камере задай Clear Flags - Depth. Потом в Culling Mask укажи какие слои рендерит каждая камера.

WISHMASTER35 21.01.2013 13:44

Ответ: Вопросы от новичка
 
Нужно нарисовать N картинок в ряд. Для этого я сразу же выделяю большой квадрат под все картинки. Если под каждую выделять, то между ними могут получится пробелы.
Выделяю так GUILayoutUtility.GetRect(items.Length*64, 64);
Но вот проблема при шести картинках выделяется большая область и инспектор уходит под полосу прокрутки.
Вот не пойму как выделить rect, чтобы он был не шире окна+полосы прокрутки, и не выше, Чем 64?
Вчера провозился, но либо items.Length == 6 лезет под полосу, либо при items.Length < 6 высота картинок очень большая. Еще и хотелось бы, чтобы эти картинки рисовались по среди окна, но GUILayout.FlexibleSpace() сжимает их до нулевого размера.

seaman 21.01.2013 14:46

Ответ: Вопросы от новичка
 
Цитата:

2- тяжелый случай, требуется запоминать положение и состояние объектов на сцене и при загрузке их полностью восстанавливать для продолжения игры с текущего момента.
Вот приличное решение:
http://whydoidoit.com/unityserializer/

mauNgerS 21.01.2013 20:47

Ответ: Вопросы от новичка
 
Вложений: 1
На объект с именем 1 повешан скрипт следующего содержания:

PHP код:

using UnityEngine;
using System.Collections;

public class 
FlipNormal MonoBehaviour {
    
    
void Start () {
    
        
Mesh m GetComponent<MeshFilter>().mesh;
        
        
Vector3[] normals m.normals;
        for (
int i=0normals.Lengthi++) 
        {    
            
normals[i] = new Vector3(normals[i].x*(-1),normals[i].y*(-1),normals[i].z*(-1));
        }
        
m.normals normals;
    }


Цель у объекта 1 добратся до меша и вывернуть нормали.
Ошибка: NullReferenceException: Object reference not set to an instance of an object
FlipNormal.Start () (at Assets/Scripts/FlipNormal.cs:10)
на строке Mesh m = GetComponent<MeshFilter>().mesh;

Что не верно?
Как можно вывернуть нормали у анимированной модели?

pax 21.01.2013 20:52

Ответ: Вопросы от новичка
 
Попробуй так:

PHP код:

using UnityEngine;
using System.Collections;

public class 
FlipNormal MonoBehaviour {
    
    
void Start () {
            var 
smr GetComponent<SkinnedMeshRenderer>();
        
Mesh m =(MeshInstantiate(smr.sharedMesh);
        
smr.sharedMesh m;
        
Vector3[] normals m.normals;
        for (
int i=0normals.Lengthi++) 
        {    
            
normals[i] = -normals[i] ;
        }
        
m.normals normals;
    }



WISHMASTER35 21.01.2013 22:01

Ответ: Вопросы от новичка
 
Отчасти разобрался со своим прошлыми вопросом.
Вот так все работает. Квадрат не уходит под полосу прокрутки, высотой не превышает 64 и размещен по средине, если меньше ширины окна.
Код:

GUILayout.BeginHorizontal();
{
GUILayout.FlexibleSpace();
Rect bigRect = GUILayoutUtility.GetAspectRect( items.Length, GUILayout.MaxWidth(64*items.Length) );
GUILayout.FlexibleSpace();
}
GUILayout.EndHorizontal();

Только не пойму как тут работает GUILayout.MaxWidth(64*items.Length) ?
Если без него, то FlexibleSpace сожмут квадрат с обеих сторон до нулевого размера.
Если бы MinWidth задавал, то понятно.

WISHMASTER35 22.01.2013 01:56

Ответ: Вопросы от новичка
 
Вложений: 1
Снова похожая проблема. Toolbar не умещается и растягивает весь инспектор.
Можно сделать, чтобы он не растягивал gui?

pax 22.01.2013 09:10

Ответ: Вопросы от новичка
 
Ты наверняка задал им фиксированную или минимальную ширину, они бы поместились. А так - выдели область по высоте и рисуй с помощью GUI, тогда лайоут не испортишь, либо скролл добавь.

WISHMASTER35 22.01.2013 15:46

Ответ: Вопросы от новичка
 
Вложений: 1
Так работает)
Код:

Rect rect = GUILayoutUtility.GetRect(GUIContent.none, GUI.skin.button, GUILayout.MaxWidth(64*items.Length));
return GUI.Toolbar(rect, selected, items, GUI.skin.button);

Но это похоже на баг ибо какой толк растягивать gui, если оно будет скрыто под полосой.

cahekp 22.01.2013 17:25

Ответ: Вопросы от новичка
 
Привет всем!
Изучаю встроенную сеть в Unity3D. Возник тут очень мучающий меня вопрос.
Как правильно инстанцировать и удалять объект по сети?

Создаю сейчас объект так: networkView.RPC("Spawn", RPCMode.AllBuffered, AllocateViewID());
Удаляю так: networkView.RPC("Destroy", RPCMode.AllBuffered, viewID);
Тела функций:
[RPC]
void Spawn(NetworkViewID viewID) {
GameObject go = Instantiate(someObj, pos, rot) as GameObject;
go.networkView.viewID = viewID;
}

[RPC]
void Destroy(NetworkViewID viewID) {
Network.RemoveRPCs(viewID);
Network.Destroy(viewID);
}

Но! Это неправильно. Если делать так, то при вызове этой функции у клиента, сервер получает ошибки:
View ID AllocatedID: XXX not found during lookup. Strange behaviour may occur.
Couldn't destroy object because the associate network view was not found
Если же вызвать это на сервере, то такую же ошибку получит клиент.

Если же написать так:
void Destroy(NetworkViewID viewID) {
if (viewID.isMine) {
Network.RemoveRPCs(viewID);
Network.Destroy(viewID);
}
}
, то тогда новый подключенный клиент видит "убитый" объект. То есть, он создается, но не удаляется.

Тоже не то. Как тогда надо писать?

pax 22.01.2013 18:08

Ответ: Вопросы от новичка
 
А при создании не проще пользоваться Network.Instantiate ?
А в остальном я мало имею опыта с Unity сетью, Photon Unity Networking создает объекты сам и удаляет тоже.

cahekp 22.01.2013 19:12

Ответ: Вопросы от новичка
 
Да вот, как оказалось, не проще.
Network.Instantiate записывается в RPC-буфер не конкретного NetworkViewID, а самого NetworkPlayer'а. В результате чего, чтобы удалить потом этот объект из сети (при этом, чтобы у новых подключившихся игроков этот объект не создавался), придется либо очищать весь RPC-буфер игрока (а не какого-то NetworkViewID, что было бы более приятней), либо добавлять еще один дополнительный NetworkViewID, чтобы он этот объект "доубивал" при его создании на новых подключенных клиентах.

Короче, очень, очень плохо, что в Unity3D нельзя смотреть и редактировать RPC-буфер любого NetworkViewID и NetworkPlayer'ов. Только глобально очищать.

Пипец, хоть свою систему RPC-буферов с нормальным редактированием пиши! На кой черт она тогда нужна в Unity?

pie 22.01.2013 19:50

Ответ: Вопросы от новичка
 
Всем привет! Пытаюсь сделать фуллскрин используя масштаб. Но что-то не то. По стандарту разрешение 807х570. Разрешение в фуллскрине 1366х768 (в моем случае). У билда выставил разрешение экрана 1366х768. Дальше читаю масштаб:
Код:

float size_width = Screen.width / 807;
float size_height = Screen.height / 570;

Применяю его к Rect. Для информативности вывожу в дебаг слудующую информацию:
Код:

Debug.Log ("size_width: " + size_width + "; size_heigh: " + size_height);
В дебаг выводит что size_width и size_heigh равны одному. Я в замешательстве. :4to:

pie 22.01.2013 19:57

Ответ: Вопросы от новичка
 
Оу. Я разобрался. В конце нужно цифр нужно было просто поставить f.

WISHMASTER35 22.01.2013 20:11

Ответ: Вопросы от новичка
 
Это поразительно, но так все работает
GUILayout.Toolbar(selected, items, GUILayout.MinWidth(0))
Вообще не представляю как тут GUILayout.MinWidth(0) может помогает)) Странное у них GUI.
Иначе GUI растянется даже за пределы экрана, не говоря уже о полосе прокрутки, но это только когда рисуется полоса прокрутки.

WISHMASTER35 22.01.2013 23:57

Ответ: Вопросы от новичка
 
Кто-нибудь пользовался классом DragAndDrop?
Не пойму как сделать, чтобы с чужих окон нельзя было перетаскивать объекты в мое окно?
А так же я так понимаю вызывать DragAndDrop.StartDrag нужно в событии MouseDrag. Но не пойму нужно ли и как проверить, что уже Drag уже начался?

mauNgerS 23.01.2013 09:04

Ответ: Вопросы от новичка
 
Вопрос. Делаю префаб, загружаю его:

GameObject wood = (GameObject)Instantiate(Resources.Load("Prefabs/wood", typeof(GameObject)));

префаб загружается розовый, без материала.

Материал надо в скрипте добавлять?

ПС Префаб сделан с материалом

Radnk 23.01.2013 09:46

Ответ: Вопросы от новичка
 
Какой 3d max лучше скачать под юнити и по какому больше всего уроков можно найти ?

pax 23.01.2013 10:05

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от mauNgerS (Сообщение 250382)
Вопрос. Делаю префаб, загружаю его:

GameObject wood = (GameObject)Instantiate(Resources.Load("Prefabs/wood", typeof(GameObject)));

префаб загружается розовый, без материала.

Материал надо в скрипте добавлять?

ПС Префаб сделан с материалом

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

Цитата:

Сообщение от Radnk (Сообщение 250383)
Какой 3d max лучше скачать под юнити и по какому больше всего уроков можно найти ?

Ставь последний, имхо это не так важно. Уроки будут полезны любые, единственное редактор материалов по моему с 2010-го макса нодовый.

cahekp 23.01.2013 10:15

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 250384)
единственное редактор материалов по моему с 2010-го макса нодовый.

...который можно в любом случае переключить на классический. Так что можешь не париться по этому поводу. Тем более, если нужен чисто для моделирования под Unity, можешь хоть древнейший 3DsMax 5 ставить. Или даже не 3DsMax, а GMax - укороченная бесплатная версия Макса чисто для игр. :)

pax 23.01.2013 10:42

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от cahekp (Сообщение 250385)
Или даже не 3DsMax, а GMax - укороченная бесплатная версия Макса чисто для игр. :)

У гмакса вроде экспорта нету. И желательно конечно чтобы макс поддерживал экспорт в Autodesk FBX. Я рекомендую ставить все же один из последних, Если не 2013, то 2012 со всеми сервиспаками.

Radnk 23.01.2013 10:53

Ответ: Вопросы от новичка
 
Вот нашел. :-D

Цитата:

Список удаленных компонентов:

Autodesk Material Library Medium Resolution Image Library
Autodesk Essential Skills Movies for 3ds Max 2013 64-bit
Composite 2013 64-bit
DirectConnect 7.0
Inventor Server Engine 64-bit Max
Revit Interoperability 64-bit Max/Design
Backburner
Autodesk 3ds Max 2013 SDK
это проблематично ? :mad:

pax 23.01.2013 11:20

Ответ: Вопросы от новичка
 
Думаю тебе эти компоненты не нужны

GooV 23.01.2013 11:56

Ответ: Вопросы от новичка
 
а можно ли использовать transform.Translate на 3rd Person Controller? Или его как-то по другому двигать можно?

mauNgerS 23.01.2013 13:41

Ответ: Вопросы от новичка
 
Почему Блиц даёт 100 - 110 кадров, а юнити 40 - 45

Дравколов в юнити ~75

Сцены аналогичные, что можно слито в один меш, что нельзя то отдельные ентити. Так же и в блице. Разница в том что бамп в юнити через материал а в блице через dot3

pax 23.01.2013 14:13

Ответ: Вопросы от новичка
 
Профайлер посмотри, что больше жрет ресурсов. Window => Profiler
Плюс еще факторы - источники света, тени, постэффекты.

mauNgerS 23.01.2013 14:29

Ответ: Вопросы от новичка
 
Профайлер Pro only а у меня free:(

А вообще на одинаковой сцене юнити быстрее должен быть?

pax 23.01.2013 14:34

Ответ: Вопросы от новичка
 
Все зависит от настроек, может что-то у тебя не так там. Может скрипты сложные. Если например выбирал паралакс шейдеры, то они тяжелые. Сколько источников света? Какие тени? Были ли тени в блице? Какое освещение? В блице повершинное, тут по умолчанию пиксельное. Плюс FPS редактора отличается от FPS билда. Посмотри и там и там.

mauNgerS 23.01.2013 15:53

Ответ: Вопросы от новичка
 
В папке Resources\Prefabs у меня лежит префаб.
Он не добавлен в сцену, а добавляется по ходу выполнения главного скрипта.

К этому префабу добавлен скрипт, который будет управлять этим префабом.

Этот скрипт должен знать об объектах, которые были добавлены в сцену до запуска(в редакторе).

Как это сделать?? Назначить переменную и перетащить на неё объект не получается, т. к. префаб попадает в сцену после запуска.

В итоге мне нужно:
Допустим есть игрок. Он идёт вперёд. Доходит до места икс. Загружается противник. И противник ЗНАЕТ где стоит игрок!!!

Неужели для этого нужно добавлять в сцену всё подряд???

pax 23.01.2013 16:09

Ответ: Вопросы от новичка
 
Способы:
1. Пометить игрока тегом Player, найти объект по тэгу.
2. Если у игрока специфический компонент, то можно найти компонент по типу (FindObjectOfType)
3. Компонент игрока записывает ссылку на себя в статическую переменную, все кому надо читают эту переменную.
4. У объекта игрока специфическое имя, можно найти объект по имени.

Я чаще всего пользуюсь 2 и 3

mauNgerS 23.01.2013 16:44

Ответ: Вопросы от новичка
 
Цитата:

Способы:
1. Пометить игрока тегом Player, найти объект по тэгу.
2. Если у игрока специфический компонент, то можно найти компонент по типу (FindObjectOfType)
3. Компонент игрока записывает ссылку на себя в статическую переменную, все кому надо читают эту переменную.
4. У объекта игрока специфическое имя, можно найти объект по имени.

Я чаще всего пользуюсь 2 и 3
Можно про способ 3 по подробнее.

pax 23.01.2013 17:13

Ответ: Вопросы от новичка
 
PHP код:

public class PlayerControllerMonoBehaviour
{
    public 
int Life 100;

     public static 
PlayerController instance;

     public 
void Awake() {
        
instance this;
     }



потом из любого скрипта

PlayerController.instance.Life -= 5;

pie 23.01.2013 18:44

Ответ: Вопросы от новичка
 
Всем привет! Я по поводу сортировки массива. Пытаюсь сортировать массив вот так:
Код:

public class Data {
        public string param1;
        public string param2;
}
Data[] data;
Data[] data_sort;

После того как data заполнил делаю следующее:
Цитата:

data_sort = data.OrderBy (t=>int.Parse (t.param2)).ToArray ();
В итоге ошибка:
Цитата:

ArgumentNullException: Argument cannot be null.
Parameter name: s
at System.Int32.Parse (System.String s) [0x00000] in <filename unknown>:0
at GeneralMain.<GetData>m__0 (.Data t) [0x00000] in <filename unknown>:0
at System.Linq.SortSequenceContext`2[Data,System.Int32].Initialize (.Data[] elements) [0x00000] in <filename unknown>:0
at System.Linq.QuickSort`1[Data].PerformSort () [0x00000] in <filename unknown>:0
at System.Linq.QuickSort`1+<Sort>c__Iterator21[Data].MoveNext () [0x00000] in <filename unknown>:0
at System.Collections.Generic.List`1[Data].AddEnumerable (IEnumerable`1 enumerable) [0x00000] in <filename unknown>:0
at System.Collections.Generic.List`1[Data]..ctor (IEnumerable`1 collection) [0x00000] in <filename unknown>:0
at System.Linq.Enumerable.ToArray[Data] (IEnumerable`1 source) [0x00000] in <filename unknown>:0
at GeneralMain.GetData (System.String response) [0x00000] in <filename unknown>:0

pax 23.01.2013 19:53

Ответ: Вопросы от новичка
 
data_sort = data.OrderBy (t=>int.Parse (t.param2??"0")).ToArray ();

pie 23.01.2013 20:07

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 250453)
data_sort = data.OrderBy (t=>int.Parse (t.param2??"0")).ToArray ();

Ошибка пропала, но сортировка не происходит.

pie 23.01.2013 21:27

Ответ: Вопросы от новичка
 
Оказалось что сортировка происходит - http://ideone.com/IdMyuR.

WISHMASTER35 24.01.2013 00:33

Ответ: Вопросы от новичка
 
Полоса прокрутки вообще страшная штука. С ней даже Space(2) может сделать отступ в 1 пиксель)

Я вот заметил, что мой сериализованный список сохраняется лишь в сцене.
После Revert из префаба все объекты списка не созданы т.е. просто null.
Объекты мои унаследованы от юнитивского Object.
Почему так может происходить?
Создаю их так:
ScriptableObject.CreateInstance(type)
Храню так:
[SerializeField] private List<Block> blockSet = new List<Block>();

pax 24.01.2013 00:37

Ответ: Вопросы от новичка
 
А в префабе объекты есть?

ну а вообще ScriptableObject в ассетах надо сохранять как *.asset

WISHMASTER35 24.01.2013 01:56

Ответ: Вопросы от новичка
 
pax, видно в префаб и не сохраняется список.
У меня не ScriptableObject, а просто Object. Создавать на каждый объект ассет будет очень не удобно. Нужно в одном списке хранить. В сцене все нормально сохраняется.

pax 24.01.2013 07:20

Ответ: Вопросы от новичка
 
Они только в сцене и сохраняются таким образом, а какой в этом толк? Классы с Serializable атрибутом прекрасно сохраняют списки на префабах.

WISHMASTER35 24.01.2013 15:10

Ответ: Вопросы от новичка
 
pax, у меня полиморфизм. Обычные классы не сохранялись.
Блин! Даже не знаю что теперь делать(

Я сейчас уже даже не уверен, что я правильно создавал свои объекты.
Эта перегрузка CreateInstance<T>() where T: ScriptableObject Позволяет создавать только наследники ScriptableObject.
В той перегрузки, которой я пользовался ScriptableObject CreateInstance(Type type) нет такой проверки.
А если просто через new создавать, то почему-то ничего не создается т.е. null возвращается. Даже не знаю как это сделано без выбрасывания исключений. В некоторых языках есть фабричные конструкторы, которые могут возвращать черт знает что. В C# о таком не слышал.

WISHMASTER35 24.01.2013 22:18

Ответ: Вопросы от новичка
 
Вложений: 1
Ну ладно, попытаюсь вешать все ScriptableObject на один ассет.
Создаю этот ассет из объекта List(:ScriptableObject), все нормально.
Код:

List list = ScriptableObject.CreateInstance<List>();
list.name = "New List";
AssetDatabase.CreateAsset(list, "Assets/New List.asset");

Затем добавляю к нему другие объекты ScriptableObject.
Код:

AssetDatabase.AddObjectToAsset(newObject, list);
И получается с иерархией полный бред.
Мой New List перемещается вглубь иерархии, а рутовым остается какая-то пустышка с тем же именем New List.
Почему так?

pax 24.01.2013 22:53

Ответ: Вопросы от новичка
 
Не мучайся и создавай отдельные ассеты, если они действительно нужны. Как ты потом будешь удалять из такого ассета объекты?

WISHMASTER35 24.01.2013 23:42

Ответ: Вопросы от новичка
 
pax, да, удаление объекта тоже вопрос. Точнее я не понял как получить список объектов у ассета, чтобы их потом удалить. Хотя они все равно хранятся в моем списке.
Я делаю список блоков для моего MineCraft. Сейчас так все просто и красиво в инспекторе редактируется. На каждый блок создавать ассет, ну совсем не гуд.

Впрочем все равно хотел, чтобы blockset можно было создавать и загружать из вне. Вообщем придется делать своим xml форматом. Жаль только для своего формата инспектор не сделаешь. Придется либо окно редактора создавать, либо блокнотом редактировать)
А сделать загрузчик для своего формата нельзя? Чтобы файл преобразовывался в юнитивский объект, как шрифт. Может в Unity 4 так уже можно?

Подумывал BlockSet писать кодом) Как в MineCraft ModLoader'е. Но тогда из вне уже сложно будет загрузить т.к. придется сначала этот код компилировать. Да и координаты текстурные вручную писать придется.
И загрузка таких кодов может быть довольно опасной. Или можно ограничить возможности этого стороннего кода?

pax 24.01.2013 23:48

Ответ: Вопросы от новичка
 
Сделаешь инспектор, это TextAsset, можешь для него сделать инспектор свой. С четверкой не работал, поэтому не знаю, в третей не слышал, но может можно...

seaman 25.01.2013 00:05

Ответ: Вопросы от новичка
 
Цитата:

И получается с иерархией полный бред.
Мой New List перемещается вглубь иерархии, а рутовым остается какая-то пустышка с тем же именем New List.
Вообще тут все четко и прозрачно. "Пустышка" - это сам ассет. Вы же ему дали имя New List тут:
Код:

AssetDatabase.CreateAsset(list, "Assets/New List.asset");
Далее идет объект, добавленный так:
Код:

AssetDatabase.AddObjectToAsset(newObject, list);
Далее изначальный лист с тем же именем New List:
Код:

list.name = "New List";
Цитата:

Точнее я не понял как получить список объектов у ассета, чтобы их потом удалить. Хотя они все равно хранятся в моем списке.
Записываешь этот список в тот же ассет с четко заданным постоянным именем. Считываешь его первым. Уже из него определяешь что в ассете.

seaman 25.01.2013 00:28

Ответ: Вопросы от новичка
 
Цитата:

А сделать загрузчик для своего формата нельзя?
Можно, конечно:
AssetPostprocessor.OnPostprocessAllAssets
ЗЫ: плохо, что инспектор для своих объектов делать нельзя :(
Вот например импорт xml описания атласа шрифта:
Код:

using UnityEditor;
using UnityEngine;

public class XMLpostprocessor : AssetPostprocessor
{

    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        foreach (string i in importedAssets)
        {
            if (i.EndsWith(".xml"))
            {
                Debug.Log("xml file impored " + i);
                FontImport.ImportFont(i);
            }
        }
    }
}

Собственно импорт осуществляет класс FontImport, а это для автоматизации импорта.

WISHMASTER35 25.01.2013 00:41

Ответ: Вопросы от новичка
 
Цитата:

Сделаешь инспектор, это TextAsset, можешь для него сделать инспектор свой.
Только этот инспектор будет для всех неизвестных форматов. Я не понял как в случае, если не мой формат, то чтобы дальше продолжался поиск подходящего инспектора.

Цитата:

Вообще тут все четко и прозрачно. "Пустышка" - это сам ассет.
Ну в принципе да, просто не привычно(и не удобно) т.к. GameObject устроен по другому.

Цитата:

Записываешь этот список в тот же ассет с четко заданным постоянным именем.
Я имел ввиду как получить список объектов ассета не создавая своего списка. Впрочем пока мне это только ради интереса.

Цитата:

AssetPostprocessor.OnPostprocessAllAssets
Надеюсь получится сделать. А редактор тогда в отдельном окне сделаю.

Цитата:

ЗЫ: плохо, что инспектор для своих объектов делать нельзя
Ага. Я когда-то в злых робатах копался. Там есть такой интересный класс SignalSender, который вызывает методы в указанных скриптах. Имена методов нужно было вручную вводить, что довольно опасно т.к. одной буквой ошибись и черт заметишь эту ошибку. Вот для него так хотелось сделать инспектор, чтобы можно было удобно выбирать объект\скрипт\метод, который нужно вызвать.
Pax говорил, что в 4 версии уже можно так делать.

seaman 25.01.2013 00:53

Ответ: Вопросы от новичка
 
Цитата:

Pax говорил, что в 4 версии уже можно так делать.
Цитата:

С четверкой не работал, поэтому не знаю
нельзя. Единственное что приходит в голову - сделать расширение своего файла txt. И:
Код:

[CustomEditor(typeof(TextAsset))]
public class GobInspector : Editor
{
    public override void OnInspectorGUI()
        {
        GUILayout.Label("This is a Label in a Custom Editor");
        }
}

Ну а внутри разбирать - Ваш ли это файл или нет.
Хотя может я на ночь глядя туплю.

pax 25.01.2013 01:07

Ответ: Вопросы от новичка
 
да, примерно так я и предлагал, так я делал для Antares Universe

WISHMASTER35 25.01.2013 01:17

Ответ: Вопросы от новичка
 
seaman, определить мой ли файл несложно. Но если файл не мой, то не знаю как переключится на следующий TextAsset редактор или на дефолтный.
Если в проекте будет несколько таких TextAsset редакторов, то работать будет только один.

Не понял о чем ты говорил, что нельзя.

seaman 25.01.2013 01:39

Ответ: Вопросы от новичка
 
Вообще для этого есть DrawDefaultInspector(); Но тут он не помогает. Не показывается текст обычного текстового файла после своего инспектора.
Цитата:

Не понял о чем ты говорил, что нельзя.
О том, что и в 4-ке нельзя.

seaman 25.01.2013 01:57

Ответ: Вопросы от новичка
 
Интересно, что инспектор текстуры расширить не так просто.
[CustomEditor(typeof(Texture))]не работает
Работает так:
[CustomEditor(typeof(TextureImporter))]
Но при этом инспектор, естественно, выглядит совершенно не стандартно.

WISHMASTER35 25.01.2013 02:01

Ответ: Вопросы от новичка
 
Вот это сообщение в котором pax писал, что в 4й версии уже можно делать инспектор для поля.
Цитата:

Сообщение от pax (Сообщение 237565)
В четверке появились класс PropertyDrawer и атрибут CustomPropertyDrawer для этих целей. А так же PropertyAttribute для модификации отображения конкретных свойств, например задать Range для чисел.

seaman, не пойму как через AssetPostprocessor.OnPostprocessAllAssets загрузить свой формат?
В документации лишь вывод в консоль написали http://docs.unity3d.com/Documentatio...AllAssets.html

pax 25.01.2013 02:04

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 250628)
Вот это сообщение в котором pax писал, что в 4й версии уже можно делать инспектор для поля.

Хорошо что напомнил, надо попробовать

WISHMASTER35 25.01.2013 02:09

Ответ: Вопросы от новичка
 
Текстура импортируется этим классом http://docs.unity3d.com/Documentatio...tImporter.html
Спасибо рефракторингу. Может и свой формат так же можно загрузить.
Я не знаю как с программированием редактора дела обстоят в UDK и CRYENGINE, но расширяемость юнити ограничивается фактически возможностью создания своего инспектора.
UPDATE
Погуглив на тему AssetImporter мне кажется, что поддержку своего формата не сделаешь.
А метод который возвращает AssetImporter для файла AssetImporter.GetAtPath наверно работает фиксировано и кастомизации не подлежит. Странно, но его пометили как extern и вынесли куда-то реализацию.

seaman 25.01.2013 10:06

Ответ: Вопросы от новичка
 
Цитата:

Текстура импортируется этим классом http://docs.unity3d.com/Documentatio...tImporter.html
Не этим. Я же написал - TextureImporter
В Юнити куча классов наследующих AssetImporter. Точно так же ты можешь наследовать AssetImporter и сделать свой импортер своего файла. Но если AssetImporter.GetAtPath работает неверно (нужно проверить) то лучше делать как я написал - переопределять AssetPostprocessor.

seaman 25.01.2013 11:58

Ответ: Вопросы от новичка
 
Посмотрел я все это. Ну неудобно расширять инспектор. Для своих объектов нельзя делать без жуткого геморроя. Если переделывать существующие то вывести стандартный без геморроя тоже не получится. OnPreviewGUI до сих пор не работает.
Единственное для чего он нормально работает - настройка своих компонентов (скриптов наследованных от монобех и повешенных на ГО). Для всего остального значительно проще писать свое окно редактора.


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

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