Воскресенье, 21 Октября 2018, 19:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Эвент на нажатие кнопки мыши
Эвент на нажатие кнопки мыши
TesticoДата: Вторник, 04 Июля 2017, 01:38 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет. Вопрос собственно вот в чем:

в игре ( если её так можно назвать ) реализовал возможность настроить клавиши для управления персонажем.

Реализовал это при помощи
Код
Event.current.keyCode

Самый раз - если задавать управление с клавы.

Но вот вопрос: если задавать с мышки ( со стандартным набором кнопок, с доп кнопками ) - уже вопрос, каким образом отловить кнопку, которая была нажата на мыши ?
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();


CEO of New Solution Studio
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)
---------------------------------------------
ЗЫ: Ладно закрыли тему. Похоже другого способа не существует :D

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
был не раз
Сейчас нет на сайте
Сильно lovegcup большое спасибо за решение. up bye
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Эвент на нажатие кнопки мыши
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2018 Рейтинг