Events 统一全球鼠标事件

Events 统一全球鼠标事件,events,unity3d,mouse,unityscript,mousedown,Events,Unity3d,Mouse,Unityscript,Mousedown,大多数Unity教程建议在更新函数中使用鼠标事件,如下所示: function Update () { if (UnityEngine.Input.GetMouseButton(1)) { } } 不过,这让我觉得效率很低,类似于在as中使用OneInterFrame或在JS中使用setInterval为整个应用程序供电——我更喜欢使用基于事件的系统 OnMouseDown()方法很有用,但仅当MouseDown位于对象上而不是场景中的任何位置时才会触发 所以这里有一个问

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

function Update () {

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

   } 

}
不过,这让我觉得效率很低,类似于在as中使用OneInterFrame或在JS中使用setInterval为整个应用程序供电——我更喜欢使用基于事件的系统

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

所以这里有一个问题:Unity中是否有一个MouseEvent用于检测鼠标按钮是否全局关闭,或者更新解决方案是推荐的选项

不过,这让我觉得非常低效,就像使用 AS中的onEnterFrame或JS中的setInterval为整个应用程序提供电源 -我更喜欢使用基于事件的系统

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

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

所以问题是:在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);
      ...
    }
  }

}
公共类MouseInputHandler:MonoBehavior
{
公共事件行动,鼠标按下;
公共事件行动鼠标移动;
...
无效更新()
{
if(输入。GetMouseButton(0))
{
鼠标按下(Input.mousePosition);
...
}
}
}

如前所述,您可以使用它而无需担心重大问题,Unity将在内部“发挥其魔力”,以便在轮询事件方面为您设置处理能力敏感的代码执行。这就是现代游戏引擎的魅力所在。通常情况下,你不应该在鼠标点击检测这样的常见功能周围进行黑客攻击


但是,如果您不想使用main Update(),您可以创建一个协程,如果您觉得这样做更合适的话,请记住Unity协程也不是多线程的,所以最后一切都需要等待。

这并不是真正的低效。事实上,任何事件驱动的输入系统都会在幕后完成这项工作,因此事件驱动的方法可能会有更大的开销。