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)

WISHMASTER35 25.06.2012 01:22

Ответ: Вопросы от новичка
 
Вложений: 1
Когда-то пытался написать окошко с выбором текстуры как в TerrainEditor.
Теперь смог написать))
Кнопки хорошо масштабируется и автоматически переносится на новую строку.
Код:

private static int SelectionSpriteGrid(int selected, XAtlas atlas, int approxSize) {
                Texture texture = atlas.GetMaterial().mainTexture;
                List<XSprite> sprites = atlas.GetSprites();
               
                const int yIndent = 5;
                int xCount = Screen.width / approxSize;
               
                GUILayout.BeginVertical("box");
                for(int i=0; i<sprites.Count;) {
                        GUILayout.BeginHorizontal();
                        for(int x=0; x<xCount; x++, i++) {
                                Rect itemRect = GUILayoutUtility.GetAspectRect((float)approxSize/(approxSize+yIndent));
                                if(i >= sprites.Count) continue;
                               
                                if(selected == i) {
                                        Rect selectRect = new Rect(itemRect.x+1, itemRect.yMax-yIndent, itemRect.width-2, yIndent);
                                        Color color = new Color(0.23f, 0.5f, 0.99f, 1f);
                                        DrawRect(selectRect, color);
                                }
                               
                                itemRect.xMin += 1;
                                itemRect.xMax -= 1;
                                itemRect.yMin += 1;
                                itemRect.yMax -= 1+yIndent;
                                if(Event.current.type == EventType.MouseDown && itemRect.Contains(Event.current.mousePosition)) {
                                        selected = i;
                                        GUI.changed = true;
                                }
                                GUI.DrawTextureWithTexCoords(itemRect, texture, sprites[i].GetFixedRect());
                        }
                        GUILayout.EndHorizontal();
                }
               
                GUILayout.EndVertical();
                return selected;
        }
       
        private static void DrawRect(Rect rect, Color color) {
                Vector3 a = new Vector3(rect.xMin, rect.yMin, 0);
                Vector3 b = new Vector3(rect.xMax, rect.yMin, 0);
                Vector3 c = new Vector3(rect.xMax, rect.yMax, 0);
                Vector3 d = new Vector3(rect.xMin, rect.yMax, 0);
               
                GL.Color(color);
                GL.Begin(GL.TRIANGLES);
                GL.Vertex(a);
                GL.Vertex(b);
                GL.Vertex(c);
                GL.Vertex(c);
                GL.Vertex(d);
                GL.Vertex(a);
                GL.End();
        }

Только данный код для моих спрайтов, но переделать будет легко.

pax 25.06.2012 08:52

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

Сообщение от WISHMASTER35 (Сообщение 231327)
Когда-то пытался написать окошко с выбором текстуры как в TerrainEditor.
Теперь смог написать))
Кнопки хорошо масштабируется и автоматически переносится на новую строку.
Только данный код для моих спрайтов, но переделать будет легко.

Выкладывая такой код надо бы выкладывать сопутствующие классы (XAtlas, XSprite) и объяснять какую роль играют. Иначе код для начинающих бесполезен. Да и для такого поста место в отдельной теме.

PS: Кстати GL и Graphics должны так же поддерживаться только в Pro.

WISHMASTER35 25.06.2012 12:28

Ответ: Вопросы от новичка
 
Если я выложу и остальной код, то для начинающего будет еще сложнее. Впрочем начинающие не лезут в редактор.
Там кстате, странный баг есть. DrawRect в разных местах рисуется более светлым или темным. Не пойму в чем дело.
Использую GL и Graphics в инди версии. Возможно не все функции присутствуют.

WISHMASTER35 25.06.2012 16:45

Ответ: Вопросы от новичка
 
А свои классы нельзя наследовать от Object?
Попробовал так сделать, но в таком классе поля не сохраняются. Если проверять ссылку на такой класс на null, то результат всегда положителен т.е. ссылка равна null, хотя это не так.

Собственно хотел, чтобы в одном классе хранились списки спрайтов, а в других классах хранились ссылки на спрайты, именно на те объекты, а не их копии. Думал, если наследовать от Object, то будет так, но оно еще хуже)

pax 25.06.2012 17:10

Ответ: Вопросы от новичка
 
ScriptableObject с сохранением в ассеты, либо делай свою сериализацию с поддержкой ссылок. Мы кстати тестировали сцену с большим количеством перекрестных ссылок - делали карту двухмерную, в каждом тайле добавляли ссылку на соседние тайлы (хотели сделать граф для поиска путей). так вот сцена сохранялась, а при открытии Unity падало. Поддержка сказала, что это известный баг, но второстепенный, поэтому не знаю, исправили ли его...

WISHMASTER35 25.06.2012 18:22

Ответ: Вопросы от новичка
 
Префабы плодить не хочу. Сейчас у меня у каждого спрайта свой id и я сравниваю эти id, а не ссылки, но это довольно не удобно(
А что за сериализацию с поддержкой ссылок?
Класс я помечаю аннотацией [System.Serializable], но это не помогает.

pax 25.06.2012 18:25

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

Можно сделать каждый спрайт MonoBehaviour и вешать эти компоненты на какой-то дочерний объект - держатель информации. Тогда сможешь сохранить на них ссылки.

WISHMASTER35 25.06.2012 18:52

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

Можно сделать каждый спрайт MonoBehaviour и вешать эти компоненты на какой-то дочерний объект - держатель информации.
Это уже интереснее. Можно даже на объект атласа повесить его спрайты, если можно будет эти спрайты скрыть в инспекторе.
Цитата:

Вообще на твоем бы месте я оставил все как есть
Ну если так делать, то можно всю жизнь гомнокодить. Работает же))

А если у меня не MonoBehaviour, а ScriptableObject, то можно добавлять компоненты на префаб? gameObject.AddComponent тут нету(:

pax 25.06.2012 19:42

Ответ: Вопросы от новичка
 
Префаб это объект сцены, а не объект данных как ScriptableObject. Можно в один ассет добавлять много других - сделать сборный ассет.

Lowlet 25.06.2012 20:49

Ответ: Вопросы от новичка
 
зависит ли скорость выполнения функций Invoke и InvokeRepeating от фпс?Если да,то мне их надо перемножать на Time.deltaTime?

WISHMASTER35 25.06.2012 20:56

Ответ: Вопросы от новичка
 
Может и надо было оставить как работало)) Теперь вообще куча ошибок каких-то))
Добавляю спрайт на префаб, а вместо моего спрайта написано type mismatch. Что это значит?

pax 25.06.2012 20:57

Цитата:

Сообщение от Lowlet (Сообщение 231413)
зависит ли скорость выполнения функций Invoke и InvokeRepeating от фпс?Если да,то мне их надо перемножать на Time.deltaTime?

от FPS наверное не зависит, а вот от Time.timeScale должна.

Цитата:

Сообщение от WISHMASTER35 (Сообщение 231414)
написано type mismatch. Что это значит?

Несоответствие типов. Т.е. разные типы данных в одном выражении.

WISHMASTER35 25.06.2012 21:08

Ответ: Вопросы от новичка
 
Не знаю где там были разные типы данных, но было из-за того, что атлас и спрайт в одном месте.
Теперь бы еще разобраться с ArgumentException: Getting control 4's position in a group with only 4 controls when doing mouseDown
Aborting.

pax 25.06.2012 21:18

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

Сообщение от WISHMASTER35 (Сообщение 231418)
Теперь бы еще разобраться с ArgumentException: Getting control 4's position in a group with only 4 controls when doing mouseDown
Aborting.

Происходит при изменении GUI "не вовремя". Попробуй при нажатии на кнопку сделать GUIUtility.ExitGUI();

WISHMASTER35 25.06.2012 22:45

Ответ: Вопросы от новичка
 
Ошибка ArgumentException: Getting control 4's position in a group with only 4 controls when doing mouseDown
Aborting была из-за того, что я начинал рисовать Button в MouseDown)

Всегда думал, что если в шейдере написать "Queue" = "Background" то рисоваться будет от родителя к детям по иерархии. Но сейчас почему-то в одной сцене в редакторе это перестало работать. Других способов рисовать в таком порядке нету?


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

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