【问题标题】:Unity global mouse eventsUnity 全局鼠标事件
【发布时间】:2014-11-22 09:22:07
【问题描述】:

大多数 Unity 教程建议在更新函数中使用鼠标事件,如下所示:

function Update () {

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

   } 

}

这让我觉得效率非常低,类似于在 AS 中使用 onEnterFrame 或在 JS 中使用 setInterval 来为整个应用程序提供动力——我真的更喜欢使用基于事件的系统。

OnMouseDown() 方法很有用,但仅当 MouseDown 位于对象上时才会触发,而不是场景中的任何位置。

那么问题来了:Unity 中是否有一个 MouseEvent 用于检测鼠标按钮是否全局按下,或者更新解决方案是否是推荐的选项?

【问题讨论】:

  • 这并不是真的低效。事实上,任何事件驱动的输入系统都是在幕后完成的,所以事件驱动的方法可能有更多的开销。

标签: events unity3d mouse unityscript mousedown


【解决方案1】:

这让我觉得效率很低,类似于使用 AS 中的 onEnterFrame 或 JS 中的 setInterval 为整个应用程序提供动力 - 我真的更喜欢使用基于事件的系统。

正如在 cmets 中已经指出的那样,这没有必要降低效率。每个基于事件的系统可能都在使用类似幕后的轮询例程,以给定的频率更新。

在许多游戏引擎/框架中,您会找到一种基于轮询的输入处理方法。我认为这与输入更新频率与帧速率/更新循环频率直接相关的事实有关。事实上,以高于或低于游戏循环的频率收听输入并没有多大意义。

所以问题来了:Unity 中是否有用于检测的 MouseEvent 如果鼠标按钮全局按下,或者是更新解决方案 推荐选项?

不,没有。顺便说一句,如果您愿意,您可以将鼠标输入检测包装在单个类中,并从那里公开其他类可以注册的事件。 比如:

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

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

}

【讨论】:

  • 在示例中,轮询例程被包装以提供基于事件的接口。
【解决方案2】:

如上所述,您可以毫无顾虑地使用它,Unity 将在内部“发挥其魔力”,根据轮询事件为您设置处理能力敏感的代码执行。毕竟,这就是现代游戏引擎的美妙之处。通常,您不必绕开鼠标点击检测等常见功能。

但是,如果您不想使用主 Update(),如果您觉得更舒服,您可以创建一个 CoRoutine,请记住 Unity 协程也不是多线程的,所以最后一切无论如何都需要等待。

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2018-03-20
    • 2017-06-05
    相关资源
    最近更新 更多