首页 > 解决方案 > 如何在 Inspector 中设置 GUI.Button 的位置?

问题描述

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并且始终位于最后一个对话项目之后,在本例中为 Locked Room。如果我要添加一个新项目,该按钮应该保留在新添加的项目之后和Canvas字段之前。

我猜这个值Rect是错误的,使按钮位于窗口外。

这是 Inspector 的屏幕截图:

督察

标签: c#unity3dunity3d-editor

解决方案


的值为RectpositionX和,positionYInspector的值以像素为单位。所以widthheight

new Rect(0.1f,0.5f,0.1f,0.1f)

只是在当前检查器的位置像素上产生一个非常小的0.1 x 0.1像素大小按钮。0.1 ,0.5由于您无法0.1在屏幕上显示大小像素的东西,因此它是不可见的。


您可以使用 AfaikGUILayoutUtility.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。这有点像混合staticrelative..css


根据您要在此处更改的确切内容,您可能更愿意使用可选options参数来更改按钮的高度和宽度,例如

GUILayout.Button("AddNewItem", GUILayout.With(100), GUILayout.Height(30));

您也可以通过临时更改EditorGUI.indentLevel来更改按钮从 X 轴开始的位置,例如

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,这不仅非常精美,并且允许您通过拖放重新排列列表中的项目,而且还可以实现AddRemove按钮默认。


我也可以问你为什么这样做

conversationtrigger = FindObjectOfType<ConversationTrigger>();

一旦您处理不活动的 GameObject、disabled ConversationTrigger、Prefab 或场景中的多个这些组件,这将失败。

在编辑器中,您已经在target. 你所要做的就是把它像

conversationtrigger = (ConversationTrigger) target;

注意:在智能手机上打字,所以没有保修,但我希望这个想法很清楚


推荐阅读