Страница 1 из 2

Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 03:26
EagleOwle
Приветствую.
Получаю Enum значение нажатой на клавиатуре кнопки.
Как можно сравнить его с другим списком типа Enum.
Что бы проверить, разрешена ли данная клавиша для переназначения?
Int значения обоих списков типа Enum совпадают. Но вот как перебрать весь имеющийся enum не соображу.

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 08:19
jetyb
Но вот как перебрать весь имеющийся enum не соображу.

Enum.GetValues

По теме см
Enum.TryParse(string enumStr)
UnityEngine.Input.GetKey(string name)

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 09:14
alt3d
Может не самое красивый код, но у меня есть такой вспогательный метод для получения всех элементов enum

Синтаксис:
Используется csharp
public static T[] GetAllAsArray<T>()
{
    try
    {
        var array = Enum.GetValues(typeof(T));
        var result = new T[array.Length];

        int i = 0;
        foreach (var elem in array)
        {
             result[i] = (T)elem;
             i++;
        }
        return result;
    }
    catch
        {
             throw new InvalidOperationException(typeof(T).ToString());
        }
}
 

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 15:53
EagleOwle
Спасибо.
Подскажите, может быть есть более изящное решение задачи?

Поясню. Пробую реализовать назначение кнопок управления.
Есть стандартный enum KeyCode
Есть enum KeyboardKey который содержит список разрешённых для переназначения клавиш

Отлавливаю нажитие клавиши на клавиатуре.
private KeyCode newKey = curEvent.keyCode;
Далее нужно проверить все элементы KeyboardKey что бы убедится, что нажатая игроком клавиши соответствует элементу в KeyboardKey
И если таковая клавиша есть, то разрешаем переназначение.
Как-то не очень... может есть более толковый способ?

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 16:11
samana
А просто узнать индекс элемента из общего массива?
Например есть список со всеми дозволенными клавишами allKey["A","Space","Return"...] и пользователь вводит "Space", тогда проверить allKey.indexOf("Space") если вернёт -1, то такого в списке нет, а если любое положительное число, то значит такой элемент в списке есть. Или я не о том? :-??

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 17:13
EagleOwle
Не понял, allKey это массив? какого типа, Integer?

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 17:21
samana
Массив любого типа, точнее того типа, который вам нужен. Но может enum-ы KeyCode и KeyboardKey это разные вещи, поэтому могу ошибаться.

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 17:35
EagleOwle
Массив private Enum[] myEnum должен в себе содержать разные Enum-ы ? Или я то-то не понимаю?
Мне же нужно сравнивать значения одного из элементов Enum со значением одного из элементов другого Enum.

Т.е.
Синтаксис:
Используется csharp

public Enum PressKey
{
 key1 3
 key2 10
 key3 275
 key4 310
}

private bool KeyPressed( Event curEvent )
{
          if (curEvent.keyCode == значение любого из элементов PressKey )
            {
                return true;
            }
            else
            {
             return false;
            }
}
 

Re: Сравнение двух enum

СообщениеДобавлено: 14 фев 2017, 17:54
samana
Я думал что как-то так должно сработать

Синтаксис:
Используется csharp
using System;
Array arr = Enum.GetValues(typeof(PressKey));// собираем все варианты в массив

PressKey someKey = PressKey.key1;// клавиша пользователя

if (Array.IndexOf(arr, someKey) != -1) Debug.Log("exist");
else Debug.Log("not exist");

Re: Сравнение двух enum

СообщениеДобавлено: 15 фев 2017, 02:17
Const
А почему сразу не использовать массив для этих целей?

Re: Сравнение двух enum

СообщениеДобавлено: 15 фев 2017, 11:15
EagleOwle
Const. Массив чего? я тугодум в этом смысле. Можешь пояснить свою мысль?

Re: Сравнение двух enum

СообщениеДобавлено: 15 фев 2017, 11:47
EagleOwle
Блин. Опять что-то делаю не так...

Синтаксис:
Используется csharp
private void OnEnable()
    {
        keyboardKeyArray = Enum.GetValues(typeof(KeyboardKey));

        //Debug
        index = 0;
        //EndDebug
    }

Проверил состав массива. Все верно нужные мне кнопки присутствуют
//Debug
    /*
    private void Update()
    {
        if (index >= 0)
        {
            if (index < keyboardKeyArray.Length)
            {
                Debug.Log(keyboardKeyArray.GetValue(index));
                index++;
            }
            else
            {
                Debug.Log("EndArray " + index);
                index = -1;
            }
        }
    }
    */

    //EndDebug

После нажатия пользователем кнопки выполняю
private bool CheckNewKey(KeyCode key)
    {
         if (Array.IndexOf(keyboardKeyArray, key) != -1)
        {
            Debug.Log("exist " + Array.IndexOf(keyboardKeyArray, key));
            return true;
        }
        else
        {
            Debug.Log("not exist " + Array.IndexOf(keyboardKeyArray, key));
            return false;
        }
    }

 


На любые кнопки возвращает false
not exist -1

???

Re: Сравнение двух enum

СообщениеДобавлено: 15 фев 2017, 12:15
samana
Может такой подход получится?

Синтаксис:
Используется csharp
using System;
using UnityEngine;

public class Test : MonoBehaviour
{
    KeyCode[] canUseKeys = new KeyCode[] {  KeyCode.W,
                                            KeyCode.A,
                                            KeyCode.S,
                                            KeyCode.D,
                                            KeyCode.LeftControl,
                                            KeyCode.LeftShift,
                                            KeyCode.Space,
                                            KeyCode.Return };


    private void OnGUI()
    {
        Event e = Event.current;
        if (e.isKey && e.type == EventType.KeyUp)
        {
            if (Array.IndexOf(canUseKeys, e.keyCode) != -1) Debug.Log("can assing key: " + e.keyCode);
            else Debug.Log("... key "+ e.keyCode + " is not supported");
        }
    }

}

Re: Сравнение двух enum

СообщениеДобавлено: 15 фев 2017, 12:57
EagleOwle
Так работает. Огромное спасибо.

Re: Сравнение двух enum

СообщениеДобавлено: 15 фев 2017, 13:17
samana
#:-s \:D/