Пользовательский редактор Unity, такой как «Матрица столкновений слоев»

Я пытаюсь показать двумерный массив в редакторе, как «Матрица столкновения слоев» показана в Unity:   введите здесь описание изображения

Хотя вместо флажков мне нужны целые числа и полная сетка (не треугольная форма). Я не могу понять, как это сделать, хотя... Я могу получить собственный редактор, хотя сделать сетку не удается. Итак, есть ли способ увидеть код редактора Physics Manager (там есть матрица коллизий слоев) или, может быть, кто-то знает хороший способ сделать это?

Примечание. Предпочтительный язык — c#, хотя подойдет любой.

Спасибо.


person The Oddler    schedule 13.11.2012    source источник


Ответы (1)


Код, связанный с тем, что вы ищете, довольно сложен, поэтому я рассчитываю, что вы поймете, о чем я здесь говорю. Документация Unity — ваш друг.

  1. Создайте GUIArea, где будет ваш специальный инструмент редактора. Внутри него поместите вызов функции, который затем вызовет другие функции рендеринга. Я подозреваю, что вы захотите сделать некоторую инкапсуляцию здесь. Инкапсуляция графического интерфейса в другую функцию позволит вам дублировать его функциональность (в пределах вашей абстракции) и более легко перемещать элементы на экране.

  2. Разработайте три опорные точки (Vector2). Каждая из них должна представлять верхнюю левую координату ваших меток строк, меток столбцов и поля данных. Обратите внимание, что якорь столбца должен находиться непосредственно над (такое же значение x, что и) якоря строки, поскольку вращение (следующий шаг) изменит якорь.

  3. Используйте GUIUtility.RotateAroundPivot(), чтобы повернуть матрицу преобразования графического интерфейса на 90° вокруг точки привязки столбца.

  4. Напишите длинные GUI.Label (или несколько) для ваших ярлыков. Закрепите их на якоре колонны. На изображении выше ваша строка метки может выглядеть примерно так: «Default\nTransparentFX\nIgnoreRaycast\nWater», где \n создает новую строку.

  5. Снова поверните на -90° к исходной матрице. Кроме того, вы можете скопировать GUI.matrix до шага 3, а затем назначить его обратно для гарантированного сброса матрицы. Вращение назад и вперед может иметь некоторую ошибку из-за плавающей запятой и других неточностей.

  6. Напишите метки для строк. Тот же метод, что и два шага назад. Закрепите их на якоре строки.

  7. Это самая сложная часть. Пройдитесь по полю данных, создавая маленькие EditorGUI.IntField(), StringField() или даже ObjectField() для каждого элемента ваших данных. Каждому элементу потребуется свой собственный якорь, который затем суммируется с якорем поля данных. Если ваше поле данных представляет собой квадратный 2D-массив, получение привязок будет простым, хотя у вас также будут пустые элементы в вашем массиве (если вам нужна точная функциональность, описанная выше). Если вы хотите сохранить память, вам придется преобразовать индексы элементов в координаты, используя некоторые хитрые математические вычисления. Я не уверен с головы до ног, как бы я это сделал.

Надеюсь, я ничего не забыл. Графический интерфейс Unity — это с**а. Комментируйте, и я сделаю все возможное, чтобы помочь вам.

person cjcurrie    schedule 08.01.2013
comment
Спасибо, выглядит хорошо. Я не знал о RotateAroundPivot (и явно не искал достаточно тщательно, чтобы найти его). Остальное кажется относительно простым (хотя, как вы сказали, графический интерфейс иногда может немного раздражать). Спасибо! Когда я это сделаю, я опубликую свой код, хотя у меня нет времени, так что может быть какое-то время. - person The Oddler; 09.01.2013
comment
Рад, что все еще актуально. Я заметил, что вопросу уже два месяца: P - person cjcurrie; 10.01.2013
comment
Да, в настоящее время я решил это менее удобным для пользователя способом, но это было нормально, поскольку только я должен его использовать. - person The Oddler; 10.01.2013
comment
@TheOddler - вы не опубликовали свое решение - смогли ли вы его придумать (или, по крайней мере, более конкретный псевдокод, чем ответ, представленный выше)? - person az2tonez; 06.07.2016
comment
@az2tonez О, старый вопрос, но то, что я сделал (если я правильно помню), было просто супер простым двойным циклом for, вычисляющим положение x, y для каждого матричного элемента. Больше не уверен, почему это не сработало сначала, теперь кажется так просто. Что-то конкретное не работает? Я использовал это для старого проекта, но код все еще должен быть где-то в моем репозитории git, поэтому я мог бы найти его, если хотите. - person The Oddler; 07.07.2016
comment
Спасибо @TheOddler! В итоге я обошёл всё это — мне просто нужна была информация в редакторе PhysicsSettings, так что у меня в инспекторе просто есть кнопка, которая синхронизирует все настройки. - person az2tonez; 22.10.2016