Unity 编辑器选项弹出窗口? (Unity 编辑器更新选项)
Unity Editor Option Popup? ( Unity Editor update Option )
问题是我有很多不同的选项,而且这些选项只会出现一次。
我有一个下拉菜单,有两个选项。 (滑块、复选框)
!!滑块!!
如果选择了滑块,我希望在编辑器中提供以下选项。 (最小值、最大值、默认值)
!!复选框!!
如果选中复选框,我想在编辑器中有以下选项。
(检查)
z.b:
我已经尝试影响编辑window。 (https://docs.unity3d.com/ScriptReference/EditorGUILayout.FadeGroupScope.html)
但是因为我只想扩展一个选项,不想创建一个新的window,这个选项一直没有太大帮助。
问题是,我该如何设计更多的选项并带走?
统一版。 2018.4.8f1
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class uitest : MonoBehaviour
{
public enum TestType { Slider, CheckBox };
public TestType test = TestType.Slider;
//[SerializeField]
private bool Check = false;
//[SerializeField]
private int MinValue = 0;
//[SerializeField]
private int MaxValue = 3;
//[SerializeField]
private int defaultValue = 2;
}
您必须为您的类型提供自己的 Editor
。将其作为 uitesteditor.cs
放置在名为 Editor
的目录下,位于 Assets.
中
有了 public
个成员(或访问器),这段代码可以在没有太多 Unity 巫术的情况下完成。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(uitest))]
[CanEditMultipleObjects]
public class uitesteditor : Editor
{
static string[] customProperties = new string[] { "Check", "MinValue", "MaxValue", "defaultValue" };
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw common properties (by excluding all custom ones)
// Could be skipped if there is none such.
DrawPropertiesExcluding(serializedObject, customProperties);
var uitarget = target as uitest;
// Custom UI based on selected enum
switch (uitarget.test)
{
case uitest.TestType.CheckBox:
uitarget.Check = EditorGUILayout.Toggle("Check", uitarget.Check);
break;
case uitest.TestType.Slider:
uitarget.MinValue = EditorGUILayout.IntField("Min value", uitarget.MinValue);
uitarget.MaxValue = EditorGUILayout.IntField("Max value", uitarget.MaxValue);
uitarget.defaultValue = EditorGUILayout.IntField("Default value", uitarget.defaultValue);
break;
}
// Needed only by DrawPropertiesExcluding
serializedObject.ApplyModifiedProperties();
}
}
如果您想使用 SerializeField
对私有字段进行操作,则需要更多样板代码。我们使用 SerializedProperty
个实例来访问 private
个序列化字段,因此代码可能看起来不太可读。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(uitest))]
[CanEditMultipleObjects]
public class uitesteditor : Editor
{
static string[] customProperties = new string[] { "test", "Check", "MinValue", "MaxValue", "defaultValue" };
SerializedProperty test, check, MaxValue, MinValue, defaultValue;
private void OnEnable()
{
test = serializedObject.FindProperty("test");
check = serializedObject.FindProperty("Check");
MinValue = serializedObject.FindProperty("MinValue");
MaxValue = serializedObject.FindProperty("MaxValue");
defaultValue = serializedObject.FindProperty("defaultValue");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw common properties (by excluding all custom ones)
DrawPropertiesExcluding(serializedObject, customProperties);
EditorGUILayout.PropertyField(test);
switch ((uitest.TestType)test.intValue)
{
case uitest.TestType.CheckBox:
EditorGUILayout.PropertyField(check);
break;
case uitest.TestType.Slider:
EditorGUILayout.PropertyField(MinValue);
EditorGUILayout.PropertyField(MaxValue);
EditorGUILayout.PropertyField(defaultValue);
break;
}
serializedObject.ApplyModifiedProperties();
}
}
注意:我添加了 CanEditMultipleObjects
标签,但您应该自行决定是否需要。呈现的检查器 GUI 将使用第一个选定对象的 test
枚举值。
问题是我有很多不同的选项,而且这些选项只会出现一次。 我有一个下拉菜单,有两个选项。 (滑块、复选框)
!!滑块!! 如果选择了滑块,我希望在编辑器中提供以下选项。 (最小值、最大值、默认值)
!!复选框!! 如果选中复选框,我想在编辑器中有以下选项。 (检查)
z.b:
我已经尝试影响编辑window。 (https://docs.unity3d.com/ScriptReference/EditorGUILayout.FadeGroupScope.html) 但是因为我只想扩展一个选项,不想创建一个新的window,这个选项一直没有太大帮助。
问题是,我该如何设计更多的选项并带走? 统一版。 2018.4.8f1
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class uitest : MonoBehaviour
{
public enum TestType { Slider, CheckBox };
public TestType test = TestType.Slider;
//[SerializeField]
private bool Check = false;
//[SerializeField]
private int MinValue = 0;
//[SerializeField]
private int MaxValue = 3;
//[SerializeField]
private int defaultValue = 2;
}
您必须为您的类型提供自己的 Editor
。将其作为 uitesteditor.cs
放置在名为 Editor
的目录下,位于 Assets.
有了 public
个成员(或访问器),这段代码可以在没有太多 Unity 巫术的情况下完成。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(uitest))]
[CanEditMultipleObjects]
public class uitesteditor : Editor
{
static string[] customProperties = new string[] { "Check", "MinValue", "MaxValue", "defaultValue" };
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw common properties (by excluding all custom ones)
// Could be skipped if there is none such.
DrawPropertiesExcluding(serializedObject, customProperties);
var uitarget = target as uitest;
// Custom UI based on selected enum
switch (uitarget.test)
{
case uitest.TestType.CheckBox:
uitarget.Check = EditorGUILayout.Toggle("Check", uitarget.Check);
break;
case uitest.TestType.Slider:
uitarget.MinValue = EditorGUILayout.IntField("Min value", uitarget.MinValue);
uitarget.MaxValue = EditorGUILayout.IntField("Max value", uitarget.MaxValue);
uitarget.defaultValue = EditorGUILayout.IntField("Default value", uitarget.defaultValue);
break;
}
// Needed only by DrawPropertiesExcluding
serializedObject.ApplyModifiedProperties();
}
}
如果您想使用 SerializeField
对私有字段进行操作,则需要更多样板代码。我们使用 SerializedProperty
个实例来访问 private
个序列化字段,因此代码可能看起来不太可读。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(uitest))]
[CanEditMultipleObjects]
public class uitesteditor : Editor
{
static string[] customProperties = new string[] { "test", "Check", "MinValue", "MaxValue", "defaultValue" };
SerializedProperty test, check, MaxValue, MinValue, defaultValue;
private void OnEnable()
{
test = serializedObject.FindProperty("test");
check = serializedObject.FindProperty("Check");
MinValue = serializedObject.FindProperty("MinValue");
MaxValue = serializedObject.FindProperty("MaxValue");
defaultValue = serializedObject.FindProperty("defaultValue");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw common properties (by excluding all custom ones)
DrawPropertiesExcluding(serializedObject, customProperties);
EditorGUILayout.PropertyField(test);
switch ((uitest.TestType)test.intValue)
{
case uitest.TestType.CheckBox:
EditorGUILayout.PropertyField(check);
break;
case uitest.TestType.Slider:
EditorGUILayout.PropertyField(MinValue);
EditorGUILayout.PropertyField(MaxValue);
EditorGUILayout.PropertyField(defaultValue);
break;
}
serializedObject.ApplyModifiedProperties();
}
}
注意:我添加了 CanEditMultipleObjects
标签,但您应该自行决定是否需要。呈现的检查器 GUI 将使用第一个选定对象的 test
枚举值。