一个关于unity3d中ios设备多点触控顺序的问题

如果只有单个触控,一般直接写Input.GetTouch(0),也许理所当然地会认为,第二个按下去的手指就是Input.GetTouch(1)。事实上有可能顺序恰恰相反。

查看Touch结构体的文档,你会发现有个fingerId变量,这个变量的文档中,官方已经解释了这个问题 :如果有触控信息发生变化(新的触摸按下或松开),已经存在的触控数据的数组索引可能会变化,而它的fingerId是不会变的。这个fingerId指的是触摸发生时,是第几个触控点。

事实上,unity内部应该是用一个固定长度的数组来保存触控数据的(假设为touchDatas),fingerId就是这个数组的索引;GetTouch里调用的数组是另外一个方便遍历的数组(假设为touches),当触控发生变化时,系统会出遍历touchDatas,把有效的触控数据依次放到touches里面。如果有手指松开,会把touchDatas里对应的数据清除掉(或者做了一个标志);有手指按下,会遍历一下touchDatas,看哪个有空位,就填入哪一个。所以,后按下的,有可能在touches里的索引比已经按住的要小。

举个例子,比如我依次按下了3根手指,touchDatas和touches里面数据都是一样的三个数据。如果我松开第二根手指,这个时候touches里面就依次为第1、3个触控信息,它们的fingerId就是0、2,但在touches里面的索引是0、1;如果我再按下一个手指,发现touchDatas里第2个数据是空位,所以这个触控的fingerId就是1,而在touches里的索引也是1。


如果处理一些较复杂的多点触控,这个问题是必须弄明白的。



你可能感兴趣的:(一个关于unity3d中ios设备多点触控顺序的问题)