激活Unity,错误捕获滚轮滑动事件
问题描述
游戏窗口监听了鼠标滚轮滑动事件
操作路径如下:
1、在游戏内移动鼠标;
2、切换别的程序,在别的窗口在前台的情况下滚动滚轮;
3、再切回程序回到unity
结果:unity自动截获了我在别的程序的滚轮滑动的最后一次输入
解决方案:
通过简单的断点可以发现,在切换后台前台的流程中,只有OnApplicationFocus这个函数会被调用。如果切入后台,则参数为false,切入前台参数为true。
根据unity官方给的执行流程图来看,OnApplicationPause执行过后会执行FixUpdate方法,并且通过捕获的日志信息看,在OnApplicationFocus方法中执行Input.mouseScrollDelta方法获取的数据都是默认数据,说明Unity在这个时候并没有开始执行捕获的外界输入的流程,通过再次观察Unity的流程图发现,unity捕获输入的时机是在update方法之前,所以这边的解决方案是通过OnApplicationFocus设置一个标志位,然后在update通过判断标志位来清除捕获的缓存。
public class InputService :MonoBehaviour
{
bool hasFocus;
void OnApplicationFocus(bool _hasFocus)
{
hasFocus = _hasFocus;
}
private void Update()
{
if(!hasFocus)
{
//clear input catch wrong data
Vector2 temp = Input.mouseScrollDelta;//mouse scroll wrong data
}else
{
//run input catch code
if(Input.mouseScrollDelta.y!=0){
if(Input.mouseScrollDelta.y>0)
{
///scroll up
}else {
///scroll down
}
}
}
}
}