Unity全局鼠标事件

7

大多数Unity教程建议在Update函数中使用鼠标事件,像这样:

function Update () {

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

   } 

}

这让我觉得非常低效,类似于使用AS中的onEnterFrame或JS中的setInterval来驱动整个应用程序-我更喜欢使用基于事件的系统。

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

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


2
这并不是真正的低效率。实际上,任何事件驱动的输入系统在幕后都会执行这个操作,因此事件驱动的方法可能有更多的开销。 - CodeSmile
2个回答

7

虽然这种方法不太高效,类似于在AS中使用onEnterFrame或在JS中使用setInterval来驱动整个应用程序,但我更喜欢使用基于事件的系统。

正如评论中已经指出的那样,这种方法并不一定效率低下。每个基于事件的系统都可能在幕后使用像这样的轮询例程,在给定频率上进行更新。

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

因此,问题是: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);
      ...
    }
  }

}

在这个例子中,轮询例程被封装以提供基于事件的接口。 - Heisenbug

1

就像上述所述,你可以放心使用它,Unity会在内部进行“魔法般”的处理来针对轮询事件为你设置处理能力敏感的代码执行。这正是现代游戏引擎的美妙之处。通常情况下,你不应该为了常见功能(如鼠标点击检测)而绕开主要的Update()方法。

然而,如果你不想使用主要的Update()方法,你可以使用协程(CoRoutine),如果你感觉更舒适的话,只要记住Unity协程也不是多线程的,因此最终所有内容仍然需要等待。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接