Как я могу установить положение GUI.Button в Инспекторе? - PullRequest
0 голосов
/ 17 мая 2019
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

[CustomEditor(typeof(ConversationTrigger))]
public class ConversationTriggerEditor : Editor
{
    private ConversationTrigger conversationtrigger;

    private void OnEnable()
    {
        conversationtrigger = FindObjectOfType<ConversationTrigger>();
    }

    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        if(GUI.Button(new Rect(0.1f,0.5f,0.1f,0.1f), "Add new item"))
        {
            conversationtrigger.conversations.Add(new Conversation());
        }

        if (GUILayout.Button("Save Conversations"))
        {
            conversationtrigger.SaveConversations();
        }

        if (GUILayout.Button("Load Conversations"))
        {
            Undo.RecordObject(conversationtrigger, "Loaded conversations from JSON");
            conversationtrigger.LoadConversations();
        }
    }
}

Я пробовал эту строку:

if(GUI.Button(new Rect(0.1f,0.5f,0.1f,0.1f), "Add new item"))

Но из-за этого кнопка исчезла как удаленная. Если я использую GUILayout.Button, я увижу кнопку, но не могу установить положение кнопки, поэтому я использую GUI.Button.

Я хочу расположить кнопку "Add new item" перед полем Canvas и всегда после последнего элемента разговора, в данном случае Запертой комнаты. И если я добавлю новый элемент, кнопка должна остаться после нового добавленного элемента и до поля Canvas.

Я думаю, что значения Rect неверны, что делает кнопку позиционируемой вне окна.

Это скриншот инспектора:

Inspector

1 Ответ

2 голосов
/ 17 мая 2019

Значения для 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;

Примечание: напечатано на смартфоне, поэтому нет гарантии, но я надеюсь, что идея станет ясной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...