В следующем GIF-файле вы можете увидеть разницу между поведением полей Vector3
в инспекторе Transform
и моих MonoBehaviour
с.
Transform
- это даже CustomEditor
, который я также написал, используя EditorGUILayout.Vector3Field()
.
[CustomEditor(typeof(Transform), true)]
[CanEditMultipleObjects]
public class AdvancedTransformEditor : Editor
{
//Unity's built-in editor
private Editor _defaultEditor;
private Transform _transform;
private void OnEnable()
{
//When this inspector is created, also create the built-in inspector
_defaultEditor = CreateEditor(targets, Type.GetType("UnityEditor.TransformInspector, UnityEditor"));
_transform = target as Transform;
}
private void OnDisable()
{
//When OnDisable is called, the default editor we created should be destroyed to avoid memory leakage.
//Also, make sure to call any required methods like OnDisable
var disableMethod = _defaultEditor.GetType().GetMethod("OnDisable", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (disableMethod != null) disableMethod.Invoke(_defaultEditor, null);
DestroyImmediate(_defaultEditor);
}
public override void OnInspectorGUI()
{
EditorGUILayout.LabelField("Local Space", EditorStyles.boldLabel);
_defaultEditor.OnInspectorGUI();
serializedObject.Update();
//Show World Space Transform
EditorGUILayout.Space();
EditorGUILayout.LabelField("World Space", EditorStyles.boldLabel);
_transform.position = EditorGUILayout.Vector3Field("Position", _transform.position);
EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.Vector3Field("Rotation", _transform.eulerAngles);
EditorGUILayout.Vector3Field("Scale", _transform.lossyScale);
EditorGUI.EndDisabledGroup();
serializedObject.ApplyModifiedProperties();
}
}
. Он работает только при наличии _defaultEditor.OnInspectorGUI();
, поэтому в оригинальном редакторе Unity для 10101* компонент должен делать что-то другое.
Когда я пытаюсь сделать то же самое в любом другом CustomEditor
для MonoBehaviour
// without a CustomEditor
public class Example : MonoBehaviour
{
public Vector3 example;
}
и
// Width the custom editor
public class ExampleMinWidth : MonoBehaviour
{
public Vector3 example;
}
[CustomEditor(typeof(ExampleMinWidth))]
public class ExampleMinWidthEditor : Editor
{
private SerializedProperty example;
private void OnEnable()
{
example = serializedObject.FindProperty("exmaple");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
example.vector3Value = EditorGUILayout.Vector3Field("Example", example.vector3Value);
// I tried both also simply using a PropertyField
//EditorGUILayout.PropertyField(example);
serializedObject.ApplyModifiedProperties();
}
}
или пропуская строку _defaultEditor.OnInspectorGUI();
в AdvancedTransformEditor
поле Vector3
сворачивается для определенной ширины инспектора.
Как я могу получить то же поведение для моих полей, что и для Transform
компонент - не складывается, но остается на одной линии?
Обновление
Я пробовал с GUILayout.MinWidth()
но это ничего не изменило.
Как и предполагалось, я также попробовал
example.vector3Value = EditorGUILayout.Vector3Field("Example", example.vector3Value, GUILayout.ExpandHeight(false));
(также для PropertyField()
), но это ничего не изменило.
И просто для попытки я тоже сделал с ExpandWidth(false)
... результат не очень приятный: D
Я даже пытался GUILayout.MaxHeight(EditorGUIUtility.singleLineHeight)
, но это заставляет поле все еще складываться, но "bload" / overdraw в поле ниже.