Пользовательский Редактор Unity, Например "Матрица Столкновений Слоев"

Я пытаюсь показать двумерный массив в редакторе, как "Матрица столкновения слоев" показана в Unity: enter image description here

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

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

спасибо.

1 ответов


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

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

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

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

  4. писать GUI.Label (или несколько из них) для ваших ярлыков. Поставьте их на якорь у колонны. Согласно изображению выше, ваш ярлык строка может выглядеть примерно так "Default\nTransparentFX\nIgnoreRaycast\nWater", где \N создает новая строка.

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

  6. написать метки для строк. Же метод, что и два шага назад. Якорь они на якоре.

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

надеюсь, я ничего не забыл. GUI Unity-это b - - - -. Комментарий и я постараюсь помочь вам.