Нарисовать в инспекто список текстур как в редакторе terrain

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DDDENISSS 13 фев 2012, 16:20

Уже несколько дней безуспешно парюсь. Вроде весь GUILayout перерыл, но так и не понял как в редакторе terrain в инспекторе рисуется список текстур с возможностью выделения одной.
.png
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DanielDem 13 фев 2012, 18:13

Открываю тайну....
взял из своих исходников
Синтаксис:
Используется csharp
                    EditorGUILayout.BeginHorizontal();

                    mLandSector.mSplatTextures[i].SplatMap = EditorGUILayout.ObjectField("   ", mLandSector.mSplatTextures[i].SplatMap,
                        typeof(Texture2D), false, GUILayout.Width(64), GUILayout.Height(64)) as Texture2D;

                    splats[i].texture = EditorGUILayout.ObjectField("   ", splats[i].texture,
                        typeof(Texture2D), false, GUILayout.Width(64), GUILayout.Height(64)) as Texture2D;

                    mLandSector.mSplatTextures[i].NormalMap = EditorGUILayout.ObjectField("  ", mLandSector.mSplatTextures[i].NormalMap,
                        typeof(Texture2D), false, GUILayout.Width(64), GUILayout.Height(64)) as Texture2D;

                    EditorGUILayout.EndHorizontal();
 
Да прибудет с Вами сила...
Аватара пользователя
DanielDem
UNITрон
 
Сообщения: 174
Зарегистрирован: 07 янв 2010, 13:27
Откуда: Россия
  • ICQ

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DDDENISSS 13 фев 2012, 19:59

что-то не врублюсь. Пишу так и получается какой-то бред.
Синтаксис:
Используется csharp
        private void DrawGameObjects(GameObject[] objects) {
                EditorGUILayout.BeginHorizontal();
                foreach(GameObject go in objects) {
                        Texture2D tex = EditorUtility.GetAssetPreview( go );
                        Object obj = EditorGUILayout.ObjectField("   ", tex, typeof(Texture2D), false,
                                                                 GUILayout.Width(64), GUILayout.Height(64));
                }
                EditorGUILayout.EndHorizontal();
        }
 

Мне кажется, что там вообще в Box'е рисуются все текстуры. В Box можно запихнуть несколько элементов?
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DDDENISSS 13 фев 2012, 21:30

Совсем никаких идей нету?
Какой элемент может отследить нажатие по нему и можно ему задать цвет фона? Button конечно может отследить нажатие, но как задать цвет фона черт знает(
Из таких элементов можно было бы составить список.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DanielDem 13 фев 2012, 21:37

Всё можно сделать.

Синтаксис:
Используется csharp
// Для бокса
Rect rect_box = EditorGUILayout.BeginHorizontal();

// Рисуем бокс
GUILayout.Box(rect_box);

// Для текстуры чтобы можно было выбирать
Rect rect_textuere = EditorGUILayout.BeginHorizontal();
Texture2D texture = EditorGUILayout.ObjectField(texture, typeof(Texture2D), false, GUILayout.Width(64), GUILayout.Height(64)) as Texture2D;
EditorGUILayout.EndHorizontal();

// и так далее

// проверка выбора
if(Event.current.type == EvetnType.mouseDown)
{
   if(rect_texture.Contians(Event.cursorPos))
   {
      selets = texture;
   }
}

EditorGUILayout.EndHorizontal();
 


Писал по пямяти так что могут быть проблемы с синтаксисом.
Да прибудет с Вами сила...
Аватара пользователя
DanielDem
UNITрон
 
Сообщения: 174
Зарегистрирован: 07 янв 2010, 13:27
Откуда: Россия
  • ICQ

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DDDENISSS 13 фев 2012, 22:47

DanielDem, если рисовать текстуру через EditorGUILayout.ObjectField, то как убрать тот кружок, при нажатии на который открывается окно выбора текстуры?
И как подсветить выделенную текстуру?
Кстати, через EditorGUILayout.ObjectField сама текстура рисуется очень маленькой, где-то 15-15 пикселей.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DDDENISSS 14 фев 2012, 00:12

Написал такой метод:
Синтаксис:
Используется csharp
private int DrawTextures(Texture2D[] textures, int selected) {
                Rect rect_box = EditorGUILayout.BeginHorizontal();
                GUI.Box( rect_box, GUIContent.none );
               
                GUILayout.Space(3);
                for( int i=0; i<textures.Length; i++ ) {
                        Texture2D tex = textures[i];
                        Rect rect_textuere = EditorGUILayout.BeginHorizontal( GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(false) );
                       
                        if( selected == i ) {
                                Color color = GUI.color;
                                GUI.color = Color.blue;
                                GUI.Box( rect_textuere, GUIContent.none );
                                GUI.color = color;
                        }
                       
                        GUILayout.Label( tex, GUILayout.Width(64), GUILayout.Height(64) );
                        EditorGUILayout.EndHorizontal(); // rect_textuere
                       
                        if(Event.current.type == EventType.MouseDown && rect_textuere.Contains(Event.current.mousePosition)) {
                                if(i != selected) Repaint();
                                selected = i;
                        }
                }
                GUILayout.Space(3);
               
                EditorGUILayout.EndHorizontal(); // rect_box
                return selected;
        }
 

Уже ближе
.png

Теперь надо понять как выровнять картинки по левому краю, сделать перенос на новую строку, если не умещается и выделить как-то ярче.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение DDDENISSS 14 фев 2012, 20:07

Начал рисовать список через Button.
Синтаксис:
Используется csharp
private int DrawTextures(Texture2D[] textures, int selected) {
                Rect rect_box = EditorGUILayout.BeginHorizontal();
                GUI.Box( rect_box, GUIContent.none );
               
                for( int i=0; i<textures.Length; i++ ) {
                        Texture2D tex = textures[i];
                       
                        Color oldColor = GUI.backgroundColor;
                        if( selected == i ) GUI.backgroundColor = Color.red;
                       
                        if( GUILayout.Button(tex, GUILayout.Width(64), GUILayout.Height(64)) ) {
                                selected = i;
                        }
                       
                        GUI.backgroundColor = oldColor;
                }
               
                EditorGUILayout.EndHorizontal(); // rect_box
                return selected;
        }
 

.png

Теперь осталось сделать перенос кнопок на новую строку, если они не умещаются. Как такое сделать?
Тут вообще кто-то писал подобное?
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Нарисовать в инспекто список текстур как в редакторе terrain

Сообщение seaman 14 фев 2012, 22:31

Ототбражение массива текстур 8 в ряд. Каждая текстура отображается 48*48.
Синтаксис:
Используется csharp
    private static readonly Dictionary<string, Texture2D> _allTilesTextureCache = new Dictionary<string, Texture2D>();

    private static void _DrawTiles()
    {
        EditorGUILayout.BeginVertical();
        EditorGUILayout.LabelField("Tiles", "");
        _scrollSprites = EditorGUILayout.BeginScrollView(_scrollSprites, true, true);
        //_DrawFieldSprites();
        _currentSelection = GUILayout.SelectionGrid(_lastSelection, _allTilesTextureCache.Values.ToArray(), 8, GUILayout.Width(48 * 8), GUILayout.Height(48 * (int)(Mathf.Round(_allTilesTextureCache.Count / 8))));
        if (_currentSelection != _lastSelection)
        {
            _lastSelection = _currentSelection;
            _MakeBigTile();
        }
        EditorGUILayout.EndScrollView();
        EditorGUILayout.EndVertical();
    }
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4