我花了几天时间搞乱Unity3D应用程序中的输入问题,在移动设备上拖动手指拖动相机穿过场景看起来非常不稳定。起初我想也许这是一个帧率问题,但帧率是稳定的。事实证明,在Update()
循环期间,当我轮询输入时,平均有大约50%的时间,我得到Touch
,但其deltaPosition
是(0,0),并且报告与我从前一帧抓取的触摸相同的deltaTime
。
因此,当我的手指在屏幕上拖动时(无论速度如何),我得到的结果如下:
触摸计数:1,触摸deltaPosition:(0.5,0.2),触摸deltaTime:0.0252472,frame:1157
触摸计数:1,触摸deltaPosition:(0.0,0.0),触摸deltaTime:0.0252472,frame:1158
触摸计数:1,触摸deltaPosition:(0.8,0.15),触摸deltaTime:0.0217239,frame:1159
触摸计数:1,触摸deltaPosition:(0.0,0.0),触摸deltaTime:0.0217239,frame:1160
当我的帧速率等于或低于60fps时,Unity是否有任何原因无法从iOS获取deltaPosition?
以下是我用来测试此代码的代码的要点:
public void Update()
{
if (Input.touches.Length > 0)
{
Debug.LogWarning("Input touches found, number of touches: " + Input.touches.Length.ToString() + ", frame: " + Time.frameCount + ", frame deltaTime: " + Time.deltaTime);
for (int i = 0; i < Input.touches.Length; ++i)
{
Touch touch = Input.GetTouch(i);
Debug.LogWarning("Touch #" + i.ToString() + ", deltaPos: " + touch.deltaPosition + ", touch deltaTime: " + touch.deltaTime);
}
}
}
我在Unity中创建了一个新项目来测试这个问题,基本上如果你在60hz查询触摸的deltaPosition,你偶尔会得到每隔一帧的deltaPosition。这非常容易重现,我不确定Unity是如何解决这个问题的。它似乎工作了一段时间,有时是秒,有时是一两分钟,然后输入更新只会发生在30hz左右,这种情况会持续几秒到几分钟。
编辑: 看起来这可能是一个Unity错误:http://www.yaku.to/blog/2015/01/08/Unity-iOS-Touch-Input-Is-Broken-But-They-Say-Its-To-Be-Expected/
编辑: 更多: touchesMoved called at irregular intervals
编辑: 还有更多:https://fogbugz.unity3d.com/default.asp?586933_i71f6o2c5c2i58r4