Эвент на нажатие кнопки мыши
|
|
Testico | Дата: Вторник, 04 Июля 2017, 01:38 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Всем привет. Вопрос собственно вот в чем:
в игре ( если её так можно назвать ) реализовал возможность настроить клавиши для управления персонажем.
Реализовал это при помощи
Самый раз - если задавать управление с клавы.
Но вот вопрос: если задавать с мышки ( со стандартным набором кнопок, с доп кнопками ) - уже вопрос, каким образом отловить кнопку, которая была нажата на мыши ?
|
|
| |
beril | Дата: Вторник, 04 Июля 2017, 06:42 | Сообщение # 2 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Mouse0, Mouse1, Mouse2,Mouse3 и т.д
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Testico | Дата: Вторник, 04 Июля 2017, 21:07 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Цитата beril ( ) Mouse0, Mouse1, Mouse2,Mouse3 и т.д А можно слегка по подробней ? )
|
|
| |
beril | Дата: Вторник, 04 Июля 2017, 21:18 | Сообщение # 4 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| как то так тык
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Testico | Дата: Среда, 05 Июля 2017, 00:29 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Как то странно, Event.current.button отлавливает только стандартные кнопки ( правую, левую, колесо ), а вот доп кнокпи не видит ...
|
|
| |
Kot-Matroskin | Дата: Пятница, 07 Июля 2017, 11:58 | Сообщение # 6 |
был не раз
Сейчас нет на сайте
| Здравствуйте. Как раз в теме не надо создавать другую. Есть камера с UI, при подключении объекту, надо передать коды нажатых клавиш.
Код if (Input.GetKeyUp(KeyCode.R)) m_Imc.currentObject.GetComponent<IOperation>().SetMode(eMode.manualControl); if (Input.GetKeyUp(KeyCode.T)) m_Imc.currentObject.GetComponent<IOperation>().SetMode(eMode.automaticControl);
Использую такую конструкцию, громоздко да и в разных объектах разная реакция на одни те же клавиши прочитал тут про Event.current.keyCode И подумал вот оно, сделаю так, буду передавать все клавиши объекту и он будет сам решать что делать с полученным кодом.
Код KeyCode kc = new KeyCode(); ... if (Input.anyKeyDown) kc = Event.current.keyCode; ... if (kc == KeyCode.G) m_txtInf.text = "G"; else m_txtInf.text = "none";
Компилируется но не работает, ругается на первый ИФ что NullReferenceException: Object reference not set to an instance of an object ПС: Прошу сильно не ругать только учусь.Добавлено (07 июля 2017, 11:41) --------------------------------------------- Нарыл вот что, если в выше приведённом коде в строчке if (Input.anyKeyDown) kc = Event.current.keyCode; заменить на kc = KeyCode.G; то работает. Получается что я не знаю как заставить работать Event.current.keyCode;
Подскажите пожалуйста, как получить код текущей нажатой клавиши типа - KeyCode Добавлено (07 июля 2017, 11:58) --------------------------------------------- Нашёл решение, если вдруг кому то понадобится
Код KeyCode kc; // Получаем код нажатой клавиши foreach (KeyCode KCode in System.Enum.GetValues(typeof(KeyCode))) if (Input.GetKeyDown(KCode)) kc = KCode;
Посылаем объекту, в нём и обрабатываем.
Код if (kc == KeyCode.G) m_txtInf.text = "G"; else m_txtInf.text = "none";
Хотя может получить KeyCode нажатой клавиши можно и более изящным способом?
Сообщение отредактировал Kot-Matroskin - Четверг, 06 Июля 2017, 22:28 |
|
| |
AndrewNovak | Дата: Пятница, 07 Июля 2017, 17:00 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| Цитата Kot-Matroskin ( ) Хотя может получить KeyCode нажатой клавиши можно и более изящным способом? KeyCode.G.ToString();
COLD DEPTH Steam PUSS! COLD DEPTH
|
|
| |
Kot-Matroskin | Дата: Пятница, 07 Июля 2017, 18:46 | Сообщение # 8 |
был не раз
Сейчас нет на сайте
| Походу я наверное немного путано изъясняюсь, я имел в виду как ещё можно получить код нажатой клавиши. Типа KeyCode kc; и потом присваиваем kc = ..... и вот тут откуда то берётся значение этой самой клавиши. как раньше было kc = Event.current.keyCode;
|
|
| |
seaman | Дата: Пятница, 07 Июля 2017, 23:24 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Event.current есть только внутри OnGUI. Вне его даст Вашу ошибку. Вы там его получить пытаетесь?
|
|
| |
Kot-Matroskin | Дата: Суббота, 08 Июля 2017, 03:01 | Сообщение # 10 |
был не раз
Сейчас нет на сайте
| Мне надо получить код нажатой клавиши типа KeyCode в переменную kc, без разницы каким способом, получить НЕ устаревшими - OnGUI. и прочим. И получить надо к примеру в Update(). Решение найдено через форич. Теперь вопрос, существует ли что то более простое / изящное чем использование foreach....Добавлено (08 июля 2017, 03:01) --------------------------------------------- ЗЫ: Ладно закрыли тему. Похоже другого способа не существует
|
|
| |
shizofren | Дата: Суббота, 08 Июля 2017, 09:16 | Сообщение # 11 |
Starting MS-DOS...
Сейчас нет на сайте
| Kot-Matroskin, привет, вот изящное решение (в foreach нет ничего плохого), которое отлавливает инпут с любого отлавливаемого устройства (мышь включительно), возвращает всё в KeyCode, не использует ничего устаревшего и имеет удобную работу с полученным результатом:
Код #region Возврат первого отловленного инпута игрока
/// <summary> /// Ссылка на корутину, которая отлавливает инпут. /// </summary> Coroutine coroutineWaitForInput;
/// <summary> /// Начать отлавливание инпута игрока. /// </summary> /// <param name="endAction">Событие, которое произойдет, когда инпут будет отловлен. Аргументы: код отловленного инпута.</param> public void StartWaitForInput(System.Action<KeyCode> endAction) { StopWaitForInput(); coroutineWaitForInput = StartCoroutine(CoroutineWaitForInput(endAction)); }
/// <summary> /// Корутина отлавливания инпута. /// </summary> /// <param name="endAction">Событие, которое произойдет, когда инпут будет отловлен. Аргументы: код отловленного инпута.</param> IEnumerator CoroutineWaitForInput(System.Action<KeyCode> endAction) { System.Array allKeyTypes = System.Enum.GetValues(typeof(KeyCode)); //Список всех кодов кнопок while (true) //Действие происходит, пока не будет отловлен инпут или не будет остановлено отлавливание вручную { foreach(object nowKeyCode in allKeyTypes) //Проверяется каждая кнопка { if (Input.GetKeyDown((KeyCode)nowKeyCode)) //Если игрок нажал текущую проверяемую кнопку - отслеживание заврешается, код кнопки возвращается { endAction.Invoke((KeyCode)nowKeyCode); StopWaitForInput(); } } yield return null; } }
/// <summary> /// Завершить отлавливание инпута игрока. /// </summary> public void StopWaitForInput() { if(coroutineWaitForInput != null) { StopCoroutine(coroutineWaitForInput); } coroutineWaitForInput = null; }
#endregion
А вот скрипт, демонстрирующий его работу, выводом первой нажатой клавиши в консоль: InputChecker.cs. Если вы не знакомы с концепцией callback-ов, советую почитать. Для того, чтобы работать с полученной клавишей, вам нужно сделать что-то вроде этого:
Код
void Start() //Старт к примеру, можно вызывать в любом подходящем месте { StartWaitForInput(OnKeyCodeGot); }
void OnKeyCodeGot(KeyCode key) { //Происходит какое-то действие с найденной клавишей }
Моя команда
Сообщение отредактировал shizofren - Суббота, 08 Июля 2017, 09:16 |
|
| |
Kot-Matroskin | Дата: Суббота, 08 Июля 2017, 09:41 | Сообщение # 12 |
был не раз
Сейчас нет на сайте
| Сильно большое спасибо за решение.
|
|
| |