为什么在 editorwindow 中我看不到 save/load 按钮并且在 EditorGUI.ObjectField 处没有 select 预制件的按钮?

Why in editorwindow I don't see anymore the save/load buttons and there is no button to select prefab at the EditorGUI.ObjectField?

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, "");
            }
        }
    }
}

截图:

save/load 按钮不显示。

ObjectField 的文本描述和字段相距太远。

我不能 select 预制件或游戏对象。在字段附近应该有一个小点,按下它应该打开一个 window,其中包含所有 prefabs/gameobjects。

我该如何组织所有这些?

There should be a small dot near the field

在您图片的右边缘,您仍然可以看到您丢失的 "dot"。简直太靠右了!


这是因为您使用的 EditorGUI.ObjectField 的固定 Rect 位置和大小根本不适合 window 大小。主要是

造成的
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);

然而,一旦宽度实际上小于字段的 x 位置,这仍然会表现得很奇怪。另请注意,您不能混合使用 EditorGUIGUILayout .. 您的按钮将显示在 ObjectField 的顶部。所以你还需要使用 GUI.Button 和相应计算的 Rects ..我不推荐它。


相反,您应该简单地使用 EditorGUILayout 变体,它使用自动检查器布局

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


The ObjectField the text description and the field too far from each other.

可以使用 EditorGUIUtility.labelWidth 更改自动标签和字段之间的距离并设置较短的宽度(您必须计算它或通过反复试验找到最佳宽度)例如

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

但是请注意,这将应用于整个 EditorWindow,而不仅仅是那个特定的字段,因为通常您希望所有字段都开始对齐。

或者,如果您不想影响所有字段,您可以做显然您已经尝试过的事情并使用 BeginHorizontalEndHorizontal 并将标签移动到 LabelField固定宽度

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

但请注意,此标签不再 "linked" 字段 →选择字段时它不会变成蓝色,更改时也不会变成粗体。


终于到了

The save/load buttons not show.

密码说

if (Selection.transforms.Length > 0)

所以我猜你没有在场景中选择任何东西

Selection.transforms

Returns the top level selection, excluding Prefabs.

This is the most common selection type when working with Scene objects.

一旦你拥有它应该可以正常工作: