Поле Enum Custom Inspector Enum позволяет условно разрешать некоторые значения перечисления, а не другие - PullRequest
0 голосов
/ 23 октября 2019

У меня есть два перечисления.

Первым является PrimaryColor, который может быть "Red, Yellow или Blue"

Вторым является TertiaryColor, который может быть "Red, Magenta, Purple, Violet, Синий и т. Д. "

Я хочу, чтобы мой пользовательский инспектор отображал только подмножество возможных значений для второго перечисления на основе значения первого перечисления. Поэтому, если бы это был Синий, я бы хотел, чтобы пользователь мог выбирать из «фиолетовый, фиолетовый, бирюзовый, пурпурный, синий», но не красный / оранжевый / и т. Д.

Я обнаружил, что есть вариантв инспекторе «checkEnabled», который звучит так, как будто он идеально подходит для этого:

https://docs.unity3d.com/ScriptReference/EditorGUILayout.EnumPopup.html

Однако я не могу его скомпилировать при попытке использовать это поле.

Может ли кто-нибудь дать мне пример того, как использовать поле checkEnabled в EnumPopUp для этого? Я могу заставить метод enumPopup нормально работать с базовыми параметрами, передавая ему строку и перечисление, однако, когда я пытаюсь передать ему метод пользовательской функции, он говорит, что все параметры не могут быть преобразованы в 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);
MyColor myColor = (MyColor)target;
Func<TertiaryColorEnum, bool> showEnumValue = ShowEnumValue;
GUIContent label = new GUIContent("Color");

//this call gives me a red line under every paramater even though they should all be what it needs
myColor.tertiaryColor = (TertiaryColorEnum)EditorGUILayout.EnumPopup(label, myColor.tertiaryColor,
showEnumValue, true);

//these ones work just fine (other parameter sets for the method)
myColor.tertiaryColor = (TertiaryColorEnum)EditorGUILayout.EnumPopup(myColor.tertiaryColor);
myColor.tertiaryColor = (TertiaryColorEnum)EditorGUILayout.EnumPopup("hi", myColor.tertiaryColor);
myColor.tertiaryColor = (TertiaryColorEnum)EditorGUILayout.EnumPopup(label, myColor.tertiaryColor);


// my custom function
public static bool ShowEnumValue(TertiaryColorEnum tertiaryColorEnum)
{  
    if(myColor.primaryColor == PrimaryColorEnum.Red)
    {
       if(tertiaryColorEnum == TertiaryColorEnum.Purple)
           return false;
       else
           return true;
    }
}

Мое лучшее предположение, что я делаю что-то не так с требуемым параметром Func, но я не понимаю, как это сделать. Буду признателен за любую помощь или идеи!

1 Ответ

0 голосов
/ 23 октября 2019

Ваше ShowEnumValue должно принять Enum . Затем вы можете привести Enum к TertiaryColorEnum внутри функции и работать с ней, но в противном случае ваша функция не соответствует прототипу Func , поэтому компилятор соответствуетвызов следующего подходящего прототипа:

public static Enum EnumPopup(string label, Enum selected, params GUILayoutOption[] options); 

Это как если бы у вас был делегат, который принял определенный тип / класс (например, Animal), и вы попытались дать ему тот, который принял производный класс (например, Lion)- делегат ожидает функцию, которая может также обрабатывать крокодилов!

Если вам интересно, читайте немного о ковариации и контравариантности.

...