Unity全球鼠标事件

时间:2014-09-27 13:39:33

标签: events unity3d mouse unityscript mousedown

大多数Unity教程建议在Update函数中使用Mouse事件,如下所示:

function Update () {

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

   } 

}

这让我感到非常低效,类似于在AS中使用onEnterFrame或在JS中使用setInterval来为整个应用程序供电 - 我真的更喜欢使用基于事件的系统。

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

所以这就是问题:Unity中是否有一个MouseEvent用于检测鼠标按钮是否全局关闭,或者Update Solution是推荐的选项吗?

2 个答案:

答案 0 :(得分:6)

  

这让我感到非常低效,但与使用类似   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);
      ...
    }
  }

}

答案 1 :(得分:1)

如上所述,你可以毫无顾虑地使用它,Unity将会发挥其神奇的作用。在内部,根据轮询事件为您设置处理功率敏感代码执行。毕竟,这就是现代游戏引擎的美妙之处。你通常不应该围绕像鼠标点击检测这样的常见功能进行黑客攻击。

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