Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
1

EditorGUILayot: GUILayotOption для создания элемента инспектора как в UI.Button для добавления ф-ий на событие

13.10.2014, 01:59. Показов 2592. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сабж.
Уверен, что можно сделать тоже самое.
Пробовал с помощью ниженаписанного, но подходящего параметра для этого не нашёл.
C#
1
static Rect BeginVertical(params GUILayoutOption[] options);
Я не прав? Сильно не прав? Или это просто делается сложнее? Какой-нибудь комбинацией?
Если создавать две группы подряд, то между ними всё равно есть зазор. Не страшно, конечно, но хочется понять как сделано там. Ведь наверняка же велосипед изобретаю.

Добавлено через 30 минут
Написал свой вариант, но он не имеет части функционала оригинала, например нет возможности выделить конкретный элемент списка, чтобы удалить именно его или ещё зачем.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    Object[] orders = new Object[1];
    int n = 1;
 
    public override void OnInspectorGUI()
    {
        EditorGUILayout.BeginVertical("Box");
        {
            GUILayout.Label("Orders");
            EditorGUILayout.BeginVertical("Box");
            {
                for(int i = 0; i < n; i++) orders[i] = EditorGUILayout.ObjectField(orders[i], typeof(Order), false);
            }
            EditorGUILayout.EndVertical();
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("+"))
            {
                var tmp = orders;
                orders = new Object[++n];
                tmp.CopyTo(orders, 0);
            }
            if (GUILayout.Button("-"))
            {
                if (n == 1) return;
                var tmp = orders;
                orders = new Object[--n];
                for (int i = 0; i < n; i++) orders[i] = tmp[i];
            }
            EditorGUILayout.EndHorizontal();
        }
        EditorGUILayout.EndVertical();
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2014, 01:59
Ответы с готовыми решениями:

Подскажите какие-нибудь годные компоненты для создания инспектора свойств
Здраствуйте, подскажите какие нибудь годные компоненты для создания инспектора свойств. И что - то...

Событие GotFocus для button отсутствует в списке событий
Событие GotFocus для button отсутствует в списке событий. Как с этим событием работать ?

Событие нажатия на button для всех элементов-кнопок
Принцип я в общем-то понимаю. Надо взять все контролируемые кнопки на форме и добавить к ним...

Написать предикат insertBeforeLast для добавления элемента в позицию предпоследнего элемента
Написать предикат insertBeforeLast для добавления элемента в позицию предпоследнего элемента. Буду...

6
52 / 52 / 7
Регистрация: 13.10.2012
Сообщений: 180
13.10.2014, 11:49 2
в юнити и так можно удалять конкретный элемент списка, достаточно по его имени нажать правой кнопкой и выбрать Delete
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
13.10.2014, 12:12 3
Если юнити 4.6 то можно просто
C#
1
2
3
4
5
6
7
using UnityEngine;
using UnityEngine.Events;
 
public class EventInspectorTest : MonoBehaviour
{
    public UnityEvent SomeEvent = new UnityEvent();
}
И у тебя событие будет в стандартном инспекторе
0
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
13.10.2014, 14:13  [ТС] 4
Цитата Сообщение от int_array Посмотреть сообщение
в юнити и так можно удалять конкретный элемент списка, достаточно по его имени нажать правой кнопкой и выбрать Delete
В UI.Button - окей, а как мне в своём инспекторе отобразить свой список?
Цитата Сообщение от arrjj Посмотреть сообщение
И у тебя событие будет в стандартном инспекторе
Возможно я не очень корректно описал проблему, извиняюсь.) Мне нужен элемент инспектора КАК в UI.Button, но не для событий.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
13.10.2014, 16:49 5
Лучший ответ Сообщение было отмечено ev-lekht как решение

Решение

Ну можно через костыли стандартными средствами юнити:
TestInspector.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using UnityEditor;
using UnityEngine;
using UnityEditorInternal;
using System.Collections.Generic;
 
[CustomEditor(typeof(Test))]
public class TestInspector : Editor
{
    SerializedProperty currentProperty = null;
    Dictionary<string, int> indexes = new Dictionary<string, int>();
 
    public override void OnInspectorGUI()
    {
        DrawListForProperty("list");
        DrawListForProperty("list2");
 
        serializedObject.ApplyModifiedProperties();
    }
 
    void DrawListForProperty(string name)
    {
        currentProperty = serializedObject.FindProperty(name);
        ReorderableList list = new ReorderableList(serializedObject, currentProperty, false, true, true, true);
        list.drawElementCallback = ElementDrawCallback;
        list.drawHeaderCallback = DrawEventHeader;
        list.onSelectCallback = SelectCallback;
        if (!indexes.ContainsKey(name)) indexes[name] = -1;
        list.index = indexes[name];
        list.DoLayoutList();
    }
 
    void SelectCallback(ReorderableList target)
    {
        indexes[currentProperty.name] = target.index;
    }
 
    void DrawEventHeader(Rect rect)
    {
        EditorGUI.LabelField(rect, currentProperty.name);
    }
 
    void ElementDrawCallback(Rect rect, int index, bool isactive, bool isfocused)
    {
        ++rect.y;
        EditorGUI.PropertyField(rect, currentProperty.GetArrayElementAtIndex(index));
    }
}
Test.cs
C#
1
2
3
4
5
6
7
8
9
using UnityEngine;
using UnityEngine.Events;
using System.Collections.Generic;
 
public class Test : MonoBehaviour
{
    public List<Vector3> list = new List<Vector3>();
    public List<Vector3> list2 = new List<Vector3>();
}
1
0 / 0 / 0
Регистрация: 03.06.2013
Сообщений: 22
13.10.2014, 17:47  [ТС] 6
Ого! Много новых функций и полей. >_<
Пойду читать API.
А по виду в редакторе - супер, то что нужно, выглядит и работает однозначно лучше моего варианта. Спасибо!

Добавлено через 5 минут
По ReorderableList нет никакой информации на офф. сайте.
Можете, если вам не сложно, дать краткое описание того, что это за класс и его полей и методов использованных в вашем коде? Интуитивно понятна часть, но с такого рода способом отрисовать в инспекторе что-то я сталкиваюсь впервые.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
13.10.2014, 19:03 7
ReorderableList это внутренний класс Unity находится в неймспейсе UnityEditorInternal, используется при отрисовке некоторых свойств (например UnityEvent'ов) хз почему он в паблик не вынесен, у юнити много чего есть интересного и полезного во внутренних классах.
C#
1
2
3
4
5
6
        list.drawElementCallback = ElementDrawCallback; //коллбэек, вызываемый для отрисовки каждого отдельного элемента, внутри в примере вызывается стандартный propertydrawer
        list.drawHeaderCallback = DrawEventHeader; //коллбэк, вызываемый при отрисовке заголовка, в примере рисуем имя свойства
        list.onSelectCallback = SelectCallback; //коллбэк, вызываемый при смене выделения , т.к. при каждом OnGUI создается новый ReorderableList нам нужно хранить индекс выделения у себя
 
        list.index = indexes[name]; //ставим сохранённый индекс
        list.DoLayoutList();//рисуем его. есть метод DoList(Rect rect) для отрисовки в кастомном месте
1
13.10.2014, 19:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2014, 19:03
Помогаю со студенческими работами здесь

Как сделать одно событие для каждого элемента массива?
Здравствуйте. Есть массив с контролами. А как сделать чтобы при наведении мыши на контрол, который...

Событие добавления элемента в ListView
Нет такого события у ListWiev! Что делать? Если включить OwnerDraw и засесть в обработчике...

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

Улучшение для инспектора в Unity
Всем доброго времени суток. В процессе разработки игры на Unity 2D возникла одна проблема с...

Написать функции для добавления/удаления элемента в очередь
Помогите пожалуйста написать написать программу, реализующую работу очереди использую простые...

Напишите функции для добавления/удаления элемента в стек
помогите написать пожалуйста программу, реализующую работу стека. Напишите функции для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru