| 
				
				Эвент на нажатие кнопки мыши
				 | 
 | 
| 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 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Сильно   большое спасибо за решение.    
 |  
| 
 | 
 |    |