gpt4 book ai didi

c# - 具有动态枚举字段的自定义 Unity C# 脚本编辑器

转载 作者:行者123 更新时间:2023-12-05 03:57:55 33 4
gpt4 key购买 nike

假设我们有以下枚举

public enum Section
{
A,
B
}

public enum SectionA
{
A1,
A2,
A3
}

public enum SectionB
{
B1,
B2,
B3
}

我想制作一个包含两个公共(public)枚举字段的脚本,并将可选值作为 Unity 编辑器的下拉列表。第一个用于选择部分(A 或 B),而第二个应该是 SectionA 或 SectionB 类型的枚举,具体取决于第一个字段上的所选值。

我为此编写了以下脚本:

public class Item : MonoBehaviour
{
[HideInInspector]
public Section Section;

[HideInInspector]
public System.Enum Value;
}


[CustomEditor(typeof(Item))]
public class ItemEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
Item item = target as Item;

item.Section = (Section)EditorGUILayout.EnumPopup(item.Section);

switch (item.Section)
{
case Section.A:
item.Value = (SectionA)EditorGUILayout.EnumPopup(item.Value);
break;
case Section.B:
item.Value = (SectionB)EditorGUILayout.EnumPopup(item.Value);
break;
}
}
}

但它会触发一个异常,指出 item.Value 为空。

我也试过替换

item.Value = (SectionA)EditorGUILayout.EnumPopup(item.Value);

item.Value = (SectionA)EditorGUILayout.EnumPopup(item.Value ?? SectionA.A1);

尝试给它一个“初始值”,但当我按下“播放”时,值 A1 会覆盖所选值。有什么想法吗?

最佳答案

我通过添加一个占位符字段来存储枚举值来修复它。

public class Item : MonoBehaviour
{
[HideInInspector]
public Section Section;

[HideInInspector]
public System.Enum Value;

[HideInInspector]
public SectionA a;

[HideInInspector]
public SectionB b;
}

switch (item.Section)
{
case Section.A:
item.Value = EditorGUILayout.EnumPopup(item.a = (SectionA)(item.Value ?? item.a));
break;
case Section.B:
item.Value = EditorGUILayout.EnumPopup(item.b = (SectionB)(item.Value ?? item.b));
break;
}

之前的方案在切换场景的时候经常会保存值失败。这工作正常。

public class Item : MonoBehaviour
{
public Section section;
public SectionA sectionA;
public SectionB sectionB;

public System.Enum Value
{
get
{
switch(section)
{
case Section.A:
return sectionA;
case Section.B:
return sectionB;
default:
return null;
}
}
}
}

[CustomEditor(typeof(Item))]
public class ItemEditor : Editor
{
SerializedProperty section;
SerializedProperty sectionA;
SerializedProperty sectionB;

void OnEnable()
{
section = serializedObject.FindProperty("section");
sectionA = serializedObject.FindProperty("sectionA");
sectionB = serializedObject.FindProperty("sectionB");
}

public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(section);
switch ((Section)section.enumValueIndex)
{
case Section.A:
EditorGUILayout.PropertyField(sectionA);
break;
case Section.B:
EditorGUILayout.PropertyField(sectionB);
break;
}
serializedObject.ApplyModifiedProperties();
}
}

关于c# - 具有动态枚举字段的自定义 Unity C# 脚本编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307515/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com