C# 统一';s自定义检查器枚举字段,有条件地允许某些枚举值,而不允许其他枚举值

C# 统一';s自定义检查器枚举字段,有条件地允许某些枚举值,而不允许其他枚举值,c#,function,unity3d,inspector,C#,Function,Unity3d,Inspector,我有两个枚举 第一种是原色,可以是“红色、黄色或蓝色” 第二种是三原色,可以是“红、品红、紫、紫、蓝等” 我希望我的自定义检查器仅显示可根据第一个枚举的值为第二个枚举选择的可能值的子集。因此,如果它是蓝色的,我希望用户能够从“紫色、紫色、青色、品红、蓝色”中进行选择,但不能选择红色/橙色/等等 我发现在自定义检查器“checkEnabled”中有一个选项,听起来很适合这样做: 但是,在尝试使用此字段时,我无法将其编译 有谁能给我举个例子,说明如何使用EnumPopUp的checkEnabled

我有两个枚举

第一种是原色,可以是“红色、黄色或蓝色”

第二种是三原色,可以是“红、品红、紫、紫、蓝等”

我希望我的自定义检查器仅显示可根据第一个枚举的值为第二个枚举选择的可能值的子集。因此,如果它是蓝色的,我希望用户能够从“紫色、紫色、青色、品红、蓝色”中进行选择,但不能选择红色/橙色/等等

我发现在自定义检查器“checkEnabled”中有一个选项,听起来很适合这样做:

但是,在尝试使用此字段时,我无法将其编译

有谁能给我举个例子,说明如何使用EnumPopUp的checkEnabled字段来实现这一点?我可以让enumPopup方法与传递字符串和enum的基本参数一起正常工作,但是当我尝试传递自定义函数方法时,它表示所有参数都不能转换为GUIlayoutoptions

//The variation of the method I am attempting to run
public static Enum EnumPopup(GUIContent label, Enum selected, Func<Enum,bool> checkEnabled, 
bool includeObsolete, params GUILayoutOption[] options);
//我尝试运行的方法的变体
公共静态枚举枚举弹出窗口(GUI内容标签、选定枚举、启用Func checkEnabled、,
bool包括BSOLETE、params GUILayoutOption[]选项);
MyColor MyColor=(MyColor)目标;
Func showEnumValue=showEnumValue;
GUIContent标签=新的GUIContent(“颜色”);
//这个电话在每个参数下都给了我一条红线,即使它们都应该是它所需要的
myColor.tertiaryColor=(TertiaryColorEnum)EditorGUILayout.EnumPopup(标签,myColor.tertiaryColor,
showEnumValue,true);
//这些参数工作得很好(该方法的其他参数集)
myColor.tertiaryColor=(TertiaryColorEnum)EditorGUILayout.EnumPopup(myColor.tertiaryColor);
myColor.tertiaryColor=(TertiaryColorEnum)EditorGUILayout.EnumPopup(“hi”,myColor.tertiaryColor);
myColor.tertiaryColor=(TertiaryColorEnum)EditorGUILayout.EnumPopup(标签,myColor.tertiaryColor);
//我的自定义函数
公共静态bool ShowEnumValue(TertiaryColorEnum TertiaryColorEnum)
{  
if(myColor.primaryColor==PrimaryColorEnum.Red)
{
if(tertiaryColorEnum==tertiaryColorEnum.Purple)
返回false;
其他的
返回true;
}
}

我最好的猜测是,我对它想要的Func参数做了一些错误的处理,但我不知道该怎么做。任何帮助或想法都将不胜感激

您的ShowEnumValue必须接受枚举。然后,您可以在函数内将枚举强制转换为TertiaryColorEnum,并对其进行操作,但否则,您的函数与Func原型不匹配,因此编译器会匹配对下一个适当原型的调用:

public static Enum EnumPopup(string label, Enum selected, params GUILayoutOption[] options); 
这就像您有一个接受特定类型/类(例如Animal)的委托,而您试图给它一个接受派生类(例如Lion)的委托一样——该委托也需要一个可以处理鳄鱼的函数


非常感谢,不知道为什么我没有想到,将其更改为使用枚举并强制转换,效果非常好。
public static Enum EnumPopup(string label, Enum selected, params GUILayoutOption[] options);