为什么在 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 位置,这仍然会表现得很奇怪。另请注意,您不能混合使用 EditorGUI
和 GUILayout
.. 您的按钮将显示在 ObjectField
的顶部。所以你还需要使用 GUI.Button
和相应计算的 Rect
s ..我不推荐它。
相反,您应该简单地使用 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,而不仅仅是那个特定的字段,因为通常您希望所有字段都开始对齐。
或者,如果您不想影响所有字段,您可以做显然您已经尝试过的事情并使用 BeginHorizontal
和 EndHorizontal
并将标签移动到 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)
所以我猜你没有在场景中选择任何东西
Returns the top level selection, excluding Prefabs.
This is the most common selection type when working with Scene objects.
一旦你拥有它应该可以正常工作:
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 位置,这仍然会表现得很奇怪。另请注意,您不能混合使用 EditorGUI
和 GUILayout
.. 您的按钮将显示在 ObjectField
的顶部。所以你还需要使用 GUI.Button
和相应计算的 Rect
s ..我不推荐它。
相反,您应该简单地使用 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,而不仅仅是那个特定的字段,因为通常您希望所有字段都开始对齐。
或者,如果您不想影响所有字段,您可以做显然您已经尝试过的事情并使用 BeginHorizontal
和 EndHorizontal
并将标签移动到 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)
所以我猜你没有在场景中选择任何东西
Returns the top level selection, excluding Prefabs.
This is the most common selection type when working with Scene objects.
一旦你拥有它应该可以正常工作: