Глобальные события мыши Unity

В большинстве руководств по Unity предлагается использовать события мыши в функции обновления, например:

function Update () {

   if (UnityEngine.Input.GetMouseButton(1)) { 

   } 

}

Это кажется мне действительно неэффективным, подобно использованию onEnterFrame в AS или setInterval в JS для работы всего приложения - я бы действительно предпочел использовать систему, основанную на событиях.

метод OnMouseDown () полезен, но срабатывает только тогда, когда MouseDown находится на объекте, а не где-либо в сцене.

Итак, вот вопрос: есть ли в Unity MouseEvent для определения того, нажата ли кнопка мыши глобально, или решение Update является рекомендуемым вариантом?


person zoosrc    schedule 27.09.2014    source источник
comment
Это не совсем неэффективно. Фактически любая система ввода, управляемая событиями, делает именно это «за кулисами», поэтому подход, управляемый событиями, скорее всего, связан с большими накладными расходами.   -  person LearnCocos2D    schedule 27.09.2014


Ответы (2)


Это кажется мне действительно неэффективным, подобно использованию onEnterFrame в AS или setInterval в JS для работы всего приложения - я бы действительно предпочел использовать систему, основанную на событиях.

Как уже отмечалось в комментариях, это не обязательно менее эффективно. Каждая система, основанная на событиях, вероятно, использует подпрограмму опроса, подобную той, которая негласно обновляется с заданной частотой.

Во многих игровых движках / фреймворках вы найдете подход, основанный на опросе, для обработки ввода. Я думаю, это связано с тем, что частота обновления входных данных напрямую связана с частотой кадров / частотой цикла обновления. На самом деле нет особого смысла прислушиваться к вводу на более высокой или более низкой частоте, чем ваш игровой цикл.

Итак, вот вопрос: есть ли в Unity MouseEvent для определения того, нажата ли кнопка мыши глобально, или решение Update является рекомендуемым вариантом?

Нет, нет. Кстати, если вы хотите, вы можете обернуть обнаружение ввода мыши внутри одного класса и выставлять события оттуда, где другие классы могут регистрироваться. Что-то типа:

public class MouseInputHandler : MonoBehavior
{
  public event Action<Vector2> MousePressed;
  public event Action<Vector2> MouseMoved;
  ...

  void Update()
  {
    if (Input.GetMouseButton(0))
    {
      MousePressed(Input.mousePosition);
      ...
    }
  }

}
person Heisenbug    schedule 27.09.2014
comment
В этом примере процедура опроса обернута для предоставления интерфейса на основе событий. - person Heisenbug; 07.08.2019

Как уже говорилось, вы можете использовать его без особых проблем, Unity будет «творить волшебство» внутри, чтобы настроить выполнение кода, чувствительного к вычислительной мощности, для вас с точки зрения событий опроса. В конце концов, в этом вся прелесть современного игрового движка. Обычно вам не нужно пытаться обойти такую ​​распространенную функцию, как обнаружение щелчка мыши.

Однако, если вы не хотите использовать основной Update (), вы можете создать CoRoutine, если вам это удобнее, просто имейте в виду, что сопрограммы Unity также не являются многопоточными, поэтому в конце все должно подождать так или иначе.

person CodeAssembler    schedule 27.09.2014