Почему в окне редактора я больше не вижу кнопок сохранения / загрузки, и нет кнопки для выбора сборного элемента в EditorGUI.ObjectField? - PullRequest
0 голосов
/ 09 октября 2019
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class SaveTransformsInfo : EditorWindow
{
    public GameObject source;

    [MenuItem("Tools/Save Transforms")]
    private static void CreateReplaceWithPrefab()
    {
        const int width = 340;
        const int height = 420;

        var x = (Screen.currentResolution.width - width) / 2;
        var y = (Screen.currentResolution.height - height) / 2;

        GetWindow<SaveTransformsInfo>().position = new Rect(x, y, width, height);
    }

    private void OnGUI()
    {
        //EditorGUILayout.BeginHorizontal();
        source = (GameObject)EditorGUI.ObjectField( new Rect(10, 30, position.width - 1, 20),
            "Select Prefab", source, typeof(GameObject), true);
        //EditorGUILayout.EndHorizontal();

        if (Selection.transforms.Length > 0)
        {
            if (GUILayout.Button("Save Transforms"))
            {
                TransformSaver.SaveTransform(Selection.transforms);
            }

            if (GUILayout.Button("Load Transforms"))
            {
                TransformSaver.LoadTransform(true, source, false, "");
            }
        }
    }
}

Снимок экрана:

Mess

Кнопки сохранения / загрузки не отображаются.

ObjectField текстовое описание и поле слишком далеко друг от друга.

Я не могу выбрать сборный или игровой объект. Рядом с полем должна быть маленькая точка, нажав на нее, откроется окно со всеми префабами / игровыми объектами.

Как мне все это организовать?

Doors

1 Ответ

1 голос
/ 09 октября 2019

Рядом с полем должна быть небольшая точка.

. На правом краю изображения вы все еще можете увидеть пропущенную "точку". Это просто слишком далеко справа!


Это вызвано тем, что вы используете EditorGUI.ObjectField с фиксированным Rect для его положения и размера, которые просто не вписываются в размер окна. В основном это вызвано

position.width - 1

, это - 1 дает вам 1 пиксель .. это 1 пиксель точки, которую вы видите на скриншоте. Вы могли бы использовать

position.width - 10

, чтобы вы могли видеть полную точку. (Я бы тогда также рекомендовал не использовать 20 для высоты поля, а скорее EditorGUIUtility.singleLineHeight).

так как

source = (GameObject)EditorGUI.ObjectField(new Rect(10, 30, position.width - 10, EditorGUIUtility.singleLineHeight), "Select Prefab", source, typeof(GameObject), true);

Однако это все равно будет вести себя странно, как только ширина станетна самом деле меньше, чем положение поля х. Также обратите внимание, что вы не можете смешивать EditorGUI и GUILayout .. ваши кнопки будут отображаться поверх ObjectField. Таким образом, вам также необходимо использовать GUI.Button с соответственно рассчитанными Rect с .. Я бы не рекомендовал это.


Вместо этого вам следует просто использовать EditorGUILayout вариант, который использует автоматическую компоновку инспектора

source = (GameObject)EditorGUILayout.ObjectField("Select Prefab", source, typeof(GameObject), true);

enter image description here

enter image description here


ObjectField текстовое описание и поле слишком далеко друг от друга.

Расстояние между автоматической меткой и полем можно изменить с помощью EditorGUIUtility.labelWidth иустановите более короткую ширину (вам придется либо рассчитать ее, либо найти лучшую методом проб и ошибок), например,

EditorGUIUtility.labelWidth = 80;
source = (GameObject)EditorGUILayout.ObjectField("Select Prefab", source, typeof(GameObject), true);

enter image description here

Обратите внимание, однакочто это будет применяться ко всему EditorWindow, а не только к этому конкретному полю, потому что обычно вы хотите, чтобы все ваши поля начинали выравниваться.

Или, если вы не хотите влиять на все поля, вы можете сделать то, что вы уже пробовали, ииспользуйте BeginHorizontal и EndHorizontal и переместите метку на LabelField с исправлениемd width

EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Select Prefab", GUILayout.Width(80));
source = (GameObject)EditorGUILayout.ObjectField(source, typeof(GameObject), true, GUILayout.ExpandWidth(true));
EditorGUILayout.EndHorizontal();

Обратите внимание, однако, что этот ярлык больше не «связан» с полем → он не станет синим, когда поле выделено, и полужирным при его изменении.


Наконец до

Кнопки сохранения / загрузки не отображаются.

код говорит

if (Selection.transforms.Length > 0)

, поэтому я предполагаю, что у вас ничего не выбрано в сцене

см. Selection.transforms

Возвращает выбор верхнего уровня, исключая префабы .

Это наиболее распространенный тип выбора при работе с Сюжетные объекты .

после того, как он у вас будет работать нормально:

enter image description here

...