Расширение AntaresBasket

Программирование на Юнити.

Расширение AntaresBasket

Сообщение seaman 27 мар 2011, 21:30

Добавляю свою кнопку (и соответственно вкладку) в корзину. Однако ведет она себя как-то странно.
1. Если изначально открыта другая вкладка - все нормально. Перетаскиваю свои объекты - открывается моя вкладка - объект добавляется в корзину (именно в мою вкладку). В дальнейшем тоже все нормально. Хоть моя вкладка открыта, хоть нет - объект можно добавить, если в моей вкладке уже есть хотя бы один объект.
2. Изначально открыта моя вкладка - в корзине нет моих объектов (изначально нет, или их оттуда все удалили -неважно). При попытке перетащить любой объект в окно корзины иконка меняется на перечеркнутый круг. Никакой объект добавить невозможно.
Не могу найти из-за чего так.
Если по приведенным данным сложно сообразить в чем дело, ответьте хотя бы какой вообще DragAndDropVisualMode соответствует перечеркнутому кругу? Событие типа "OnMouseEnter/OnDragEnter" вообще мне неизвестно, а оно явно обрабатывается - иконка меняется сразу как курсор входит в окно корзины. Как Юнити отслеживает вход мыши в окно в редакторе?

Код пока не привожу - весь класс AntaresBasket достаточно большой...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Расширение AntaresBasket

Сообщение Neodrop 27 мар 2011, 22:16

По описанию невозможно понять вообще, что вы делаете.
Перечёркнутый круг означает, что окно не принимает такой тип переносимого объекта. Почему? Я без понятия, не зная что вы там куда таскаете.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Расширение AntaresBasket

Сообщение seaman 27 мар 2011, 23:09

Я таскаю Mesh. Хочу сделать там еще кнопку "Combine" для объединения мешей в один...
Час попытаюсь код выложить тот что добавил...
Синтаксис:
Используется csharp
public class AntaresBasket : EditorWindow
{
    const string _DUPLICATE_POSTFIX = "_copy";
...
    static Dictionary<Mesh, Texture> listMeshes = new Dictionary<Mesh, Texture>();

    [MenuItem("Antares/BASKET &b")]
    static void CreateWindow()
    {
...
        buttonsContent[8] = new GUIContent("Meshs", "combine & export");
    }
...
    void OnGUI()
    {
...
            switch (currentButton)
            {
...
                case 8:
                    ShowCombine();
                    break;
            }
...
            if (Event.current.type == EventType.DragExited) // && window.position.Contains(Event.current.mousePosition))
            {
                switch (currentButton)
                {
...
                    case 8:
                        //Нужно не сам перетаскиваемый объект в список добавлять, а делать Copy
                        var typeMe = typeof (Mesh);
                        var count = DragAndDrop.objectReferences.Length;
                        for (var i = 0; i < count; i++)
                        {
                            var m = ((Mesh)DragAndDrop.objectReferences[i]);
                            if (DragAndDrop.objectReferences[i].GetType() != typeMe || listMeshes.ContainsKey(m)) continue;
                            listMeshes.Add(m, EditorGUIUtility.ObjectContent(m, typeof(Mesh)).image);
                            addedCount++;
                        }
                        break;
                }
...
    private void ShowCombine()
    {
        var count = listMeshes.Count;
        GUI.enabled = count > 0;
        var mIn = new Mesh[count];
        listMeshes.Keys.CopyTo(mIn, 0);
        for (var i = 0; i < count; i++)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(new GUIContent(listMeshes[mIn[i]]), GUILayout.Width(24), GUILayout.Height(24));
            EditorGUILayout.ObjectField(mIn[i], typeof (Mesh), GUILayout.Width(256));
            if (GUILayout.Button("Remove", EditorStyles.miniButton, GUILayout.Width(60))) _toRemove = mIn[i];
            _toDragCandidate = mIn[i];
            PushButton();
            GUILayout.EndHorizontal();
        }
        if (_toRemove != null) listMeshes.Remove((Mesh) _toDragCandidate);
    }
...

Надеюсь ничего не упустил. Делал все по аналогии с Вашими вкладками. (А куда можно выложить код класса целиком, чтобы не загромождать тут форум?)

PS: "окно не принимает такой тип переносимого объекта". Это понятно - непонятно почему если открыта одна из Ваших вкладок - все принимает. И если один меш уже там есть - тоже все принимает? Окно то ведь тоже самое...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Расширение AntaresBasket

Сообщение Neodrop 27 мар 2011, 23:27

Чтобы выложить код, достаточно прикрепить файл к вашему ответу. Но смотреть его я точно не буду в ближайшие дни - нет времени.
P.S. Заодно с файлом, опишите всё-таки нормально, что именно вы там хотите сделать.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Расширение AntaresBasket

Сообщение seaman 28 мар 2011, 18:46

Нашел.
Лишняя строка вкралась:
Синтаксис:
Используется csharp
GUI.enabled = count > 0;

Естественно пока во вкладке ничего нет - она не активна...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Скрипты

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 8