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

Программирование на Юнити.

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

Сообщение EagleOwle 14 фев 2017, 03:26

Приветствую.
Получаю Enum значение нажатой на клавиатуре кнопки.
Как можно сравнить его с другим списком типа Enum.
Что бы проверить, разрешена ли данная клавиша для переназначения?
Int значения обоих списков типа Enum совпадают. Но вот как перебрать весь имеющийся enum не соображу.
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

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

Сообщение jetyb 14 фев 2017, 08:19

Но вот как перебрать весь имеющийся enum не соображу.

Enum.GetValues

По теме см
Enum.TryParse(string enumStr)
UnityEngine.Input.GetKey(string name)
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

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

Сообщение alt3d 14 фев 2017, 09:14

Может не самое красивый код, но у меня есть такой вспогательный метод для получения всех элементов 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());
        }
}
 
alt3d
Старожил
 
Сообщения: 687
Зарегистрирован: 04 сен 2011, 21:19
  • Сайт
  • ICQ

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

Сообщение EagleOwle 14 фев 2017, 15:53

Спасибо.
Подскажите, может быть есть более изящное решение задачи?

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

Отлавливаю нажитие клавиши на клавиатуре.
private KeyCode newKey = curEvent.keyCode;
Далее нужно проверить все элементы KeyboardKey что бы убедится, что нажатая игроком клавиши соответствует элементу в KeyboardKey
И если таковая клавиша есть, то разрешаем переназначение.
Как-то не очень... может есть более толковый способ?
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

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

Сообщение samana 14 фев 2017, 16:11

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

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

Сообщение EagleOwle 14 фев 2017, 17:13

Не понял, allKey это массив? какого типа, Integer?
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

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

Сообщение samana 14 фев 2017, 17:21

Массив любого типа, точнее того типа, который вам нужен. Но может enum-ы KeyCode и KeyboardKey это разные вещи, поэтому могу ошибаться.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение EagleOwle 14 фев 2017, 17:35

Массив 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;
            }
}
 
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

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

Сообщение samana 14 фев 2017, 17:54

Я думал что как-то так должно сработать

Синтаксис:
Используется 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");
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение Const 15 фев 2017, 02:17

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

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

Сообщение EagleOwle 15 фев 2017, 11:15

Const. Массив чего? я тугодум в этом смысле. Можешь пояснить свою мысль?
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

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

Сообщение EagleOwle 15 фев 2017, 11:47

Блин. Опять что-то делаю не так...

Синтаксис:
Используется 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

???
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

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

Сообщение samana 15 фев 2017, 12:15

Может такой подход получится?

Синтаксис:
Используется 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");
        }
    }

}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение EagleOwle 15 фев 2017, 12:57

Так работает. Огромное спасибо.
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

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

Сообщение samana 15 фев 2017, 13:17

#:-s \:D/
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9