今天做了一个项目,关于多点触摸,因为屏幕大,所以要用的人也比较多,所以需求是:当手指碰到的时候,产生一个波纹(波纹就是给的一个序列帧)
先谈一谈遇到的坑,刚开始用的unity自带事件OnPointerDown,就是在方法中实例化一个特效的image(下面用ImageEffect表示),然后给imageEffect赋予父对象canvas,测试:一个手指没问题!挺高兴,可是到了第二个手指的时候,是显示出来了一个特效,但是是在两个手指的中间,第三个手指一样。
后来查了半天才知道(真的是半天啊哭唧唧o(╥﹏╥)o),详情请看下面(复制过来的)
1) 如果使用鼠标操作,那么Input.GetAxis对鼠标移动的取值方式表现的很正常,因为不管是否点击,鼠标始终存在,鼠标位置始终能够正常获取,Input.GetAxis("Mouse X")原本是为鼠标设计的,取值方式是连续的;使用Input.GetTouch(0).deltaPosition无效,因为没有触摸操作;
2)如果使用触摸操作,再细分两种情形:
a. 如果使用if(Input.GetMouseButton(0))来作为判断是否按下的条件:
那么使用Input.GetAxis来获取手指的移动就需要注意了,触摸的手指是可以离开屏幕的,一旦手指离开屏幕,GetAxis("Mouse X")就不知所措了,只好记住离开前的手指位置,下一次手指再接触的时候和这个位置对比(个人猜测GetAxis("Mouse X")是对比鼠标/触摸点位置的方法来取得的)。例如手指从屏幕的左边拿开,然后再触摸屏幕的右边,那么取得的x位置会是一个很大的正值。这就是个很大的问题,这个问题是GetMouseButton和GetAxis在使用手指触摸的情况下配合上的不默契产生的。但是使用Input.GetTouch(0).deltaPosition就不会有这种现象,个人猜测可能是因为deltaPosition是测量每一帧内的移动距离的方法吧。
b. 如果使用if(Input.touchCount>0&&Input.GetTouch(0).phase == TouchPhased.Moved)来做为判断是否按下的条件:
使用Input.GetAxis("Mouse X"),没有任何问题;
使用deltaPosition同样没有任何问题,因为这就是为触摸操作而设计的。
虽然上头说的是GetMouseButton,但是因为都是鼠标事件,就当OnPointerDown也是了。。。。。。。。
然后就是用了Input,一次成功啊,附上代码(怎么写代码啊。。别人的都好漂亮):
if(Input.touchCount > 0)
{
for (int i = 0; i < Input.touchCount; i++)
{
if (Input.GetTouch(i).phase == TouchPhase.Began)
{
ToughEffect = Instantiate(Img_ToughEffect, new Vector3(Input.GetTouch(i).position.x, Input.GetTouch(i).position.y, 0), Quaternion.identity);
ToughEffect.transform.SetParent(canvas.transform);
}
}
}
没了!