如何在 Unity 中处于非活动状态后使光标消失



我的目标很简单,就像很多应用程序一样,我想在用户不活动一段时间后使光标不可见

我的解决方案似乎并没有真正优化,这是算法

void Start {
    Timer t = new Timer(5000);//Create a timer of 5 second
    t.start();
}
void Update {
    if(MouseMoved){
        t.reset();
    }
    timeLeft = t.deltaTime;
    if ( timeLeft == 5000 )
    {
        Cursor.visible = false;
    }
}

真的不喜欢在每一帧都检查鼠标是否移动,我宁愿我的鼠标移动触发一些东西,但我在这里迷路了,有人有更好的解决方案吗?

这应该是使用协程完成任务的好方法,没有任何内存问题:

private Coroutine co_HideCursor;
void Update()
{
    if (Input.GetAxis("Mouse X") == 0 && (Input.GetAxis("Mouse Y") == 0))
    {
        if (co_HideCursor == null)
        {
            co_HideCursor = StartCoroutine(HideCursor());
        }
    }
    else
    {
        if (co_HideCursor != null)
        {
            StopCoroutine(co_HideCursor);
            co_HideCursor = null;
            Cursor.visible = true;
        }
    }
}
private IEnumerator HideCursor()
{
    yield return new WaitForSeconds(3);
    Cursor.visible = false;
}

据我所知,有两种方法可以在更新循环之外检查这样的事情:

1 - 自定义事件。

编写自己的自定义事件将允许您在更新函数之外调用类似"OnMouseMove()"的内容,并且它仅在鼠标光标的位置更改时执行。

2 - 协程

创建单独的协程可以降低执行此检查的频率。为此,您需要创建一个 IEnumerator 并将鼠标移动逻辑放入其中。像这样:

IEnumerator MouseMovement()
{
    while(true)
    {
        if(MouseMoved)
        {
           //Do stuff
        }
        yield return new WaitForSeconds(1f);
    }
}

该协程将在运行时每秒执行一次检查。您可以通过以下方式开始协程:

StartCoroutine(MouseMovement());

为了阻止它,你打电话

StopCoroutine(MouseMovement());

如果在计时器达到 0 时启动它,并在移动游标时停止它,则还可以防止协程一直运行,仅在游标处于非活动状态时才使用它。

相关内容

最新更新