Значения для Rect
: positionX
, positionY
, width
и height
, а для Инспектора - в пикселях.Таким образом,
new Rect(0.1f,0.5f,0.1f,0.1f)
просто приводит к действительно крошечной маленькой кнопке размером 0.1 x 0.1
в позиции 0.1 ,0.5
пикселей текущего Инспектора.Так как вы не можете отобразить что-то размером 0.1
пикселей на экране, оно невидимо.
Afaik, вы можете использовать GUILayoutUtility.GetLastRect
, чтобы получить Rect
последнего элемента управления перед кнопкой, а затем поместите кнопку с помощью этого прямоугольника, например,
Rect lastRect = GUILayoutUtility.GetLastRect();
Rect buttonRect = new Rect(lastRect.x, lastRect.y + EditorGUIUtility.singleLineHeight, 100, 30);
if(GUI.Button(buttonRect, "AddNewItem")
...
, чтобы поместить кнопку I на следующей строке под последним элементом управления и установить ее размер на 100px * 30px
.
Однако я бы вообще рекомендовал не смешивать GUI
и GUILayout
.Это примерно то же самое, что и смешивание static
и relative
в css
..
В зависимости от того, что именно вы хотите изменить, вы можете использовать опциональный *Параметр 1034 *, например, для изменения высоты и ширины кнопок с помощью
GUILayout.Button("AddNewItem", GUILayout.With(100), GUILayout.Height(30));
, когда кнопка начинается по оси X, вы также можете изменить ее, временно изменив EditorGUI.indentLevel например
EditorGUI.indentLevel++
GUILayout.Button("AddNewItem", GUILayout.With(100), GUILayout.Height(30));
EditorGUI.indentLevel--;
Для изменения положения в направлении Y вы можете использовать EditorGUILayout.Space
EditorGUILayout.Space();
if(GUILayout.Button(...))
, чтобы иметь небольшое расстояние по умолчанию между кнопкой и элементом управления доили GUILayout.Space
, например,
GUILayout.Space(30);
if(GUILayout.Button(...))
, чтобы установить фиксированное пространство в пикселях.
К вашему актуальному вопросу
Если вы действительно хотите поместить кнопку между элементами управления, прежде чем приступать к реализации редактора для всего инспектора вместо использования DrawDefaultInspector
, поскольку это также означает, что вам придется освободить место для кнопки,В противном случае вы можете получить несколько элементов управления друг на друга.
Я не буду делать это для вас здесь.Мы даже не можем видеть поля / типы ваших классов.
Но так как вы используете список / массив там, я (как я часто это делаю) еще раз настоятельно рекомендую использовать недокументированное ReorderableList
, который не только чрезвычайно необычен и позволяет вам переставлять элементы в списке с помощью перетаскивания, но также включает кнопки Add
и Remove
по умолчанию.
Можно такжеспросите, почему вы делаете
conversationtrigger = FindObjectOfType<ConversationTrigger>();
Это произойдет сбой, как только вы имеете дело с неактивным GameObject, отключенным ConversationTrigger
, Prefab или просто несколькими из этих компонентов в сцене.
В редакторе вы уже получаете проверенный на данный момент компонент в target
.Все, что вам нужно сделать, это разыграть его как
conversationtrigger = (ConversationTrigger) target;
Примечание: напечатано на смартфоне, поэтому нет гарантии, но я надеюсь, что идея станет ясной