Страница 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