大多数Unity教程建议在Update函数中使用Mouse事件,如下所示:
function Update () {
if (UnityEngine.Input.GetMouseButton(1)) {
}
}
这让我感到非常低效,类似于在AS中使用onEnterFrame或在JS中使用setInterval来为整个应用程序供电 - 我真的更喜欢使用基于事件的系统。
OnMouseDown()方法很有用,但只有在MouseDown位于对象上时才会触发,而不是在场景中的任何位置触发。
所以这就是问题:Unity中是否有一个MouseEvent用于检测鼠标按钮是否全局关闭,或者Update Solution是推荐的选项吗?
答案 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协程不是多线程的,所以在无论如何,一切都需要等待。