如何在Unity中不活动后使光标消失

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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;
    }
}

如果移动鼠标,我真的不喜欢检查每一帧,我更喜欢我的鼠标移动触发器,但我迷失在这里,是否有人有更好的解决方案?

答案

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

1 - 自定义事件。

编写自己的自定义事件将允许您在更新函数之外调用类似“OnMouseMove()”的内容,并且只有在鼠标光标的位置发生变化时才会执行。

2 - 协同程序

创建单独的协程将允许您不那么频繁地执行此检查。为此,您创建一个IEnumerator并将鼠标移动逻辑放在那里。就像是:

IEnumerator MouseMovement()
{
    while(true)
    {
        if(MouseMoved)
        {
           //Do stuff
        }

        yield return new WaitForSeconds(1f);
    }
}

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

StartCoroutine(MouseMovement());

为了阻止它,你打电话

StopCoroutine(MouseMovement());

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

另一答案

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

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;
}

以上是关于如何在Unity中不活动后使光标消失的主要内容,如果未能解决你的问题,请参考以下文章

UNITY3D切换到GUI场景鼠标就消失了用Cursor.visible=(true);光标就在中间不动了,怎么让光标移动?

如何在 10 分钟不活动后使 PHP 会话过期? [复制]

如何在请求后使 IdentityDbContext 保持活动状态,以便服务可以使用 UserManager 完成其任务?

可扩展列表视图在 android 的片段活动中不起作用

是否可以在一定时间后使 UNNotification 过期或消失?

按钮在片段中不起作用