首页新闻找找看学习计划

安卓多点触控问题

0
悬赏园豆:20 [已关闭问题] 关闭于 2017-12-25 20:17

在使用U3d引擎,C#语言开发摇杆时遇到个多点触控问题,希望大佬帮忙解惑。

点下一根手指控制摇杆,现在在点下第二根手指,然后松开第一根手指,在点下去,这时候摇杆就不受第一根手指的控制了,被第二根手指控制,下面是我的代码,求解惑。

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.EventSystems;
 4 using UnityEngine.UI;
 5 
 6 /// <summary>
 7 /// 虚拟摇杆
 8 /// </summary>
 9 public class Rocker : Base, IBeginDragHandler,IDragHandler, IEndDragHandler
10 {
11     public RectTransform canvas;//画布RectTransform
12 
13     private RectTransform rockerBg;//摇杆背景RectTransform
14     private float ratio;//画布与屏幕之间的比例
15     private Vector2 parentCenter;//摇杆背景图中心点的屏幕坐标,即摇杆初始位置坐标。
16     private Touch touch;//代表控制摇杆的手指
17 
18     //摇杆移动方向的方向向量的X轴的值与Y轴的值
19     public static float x;
20     public static float y
21     private void Start()
22     {
23         rockerBg = this.transform.parent as RectTransform;
24         ratio = canvas.sizeDelta.x / Screen.width;
25         parentCenter = this.transform.parent.position;
26     }
27 
28     int a;
29     Vector2 dir;
30     /// <summary>
31     /// 当拖动摇杆时
32     /// </summary>
33     /// <param name="eventData"></param>
34     public void OnDrag(PointerEventData eventData)
35     {
36         foreach (var item in Input.touches)
37         {
38             if (item.fingerId == a)
39             {
40                 dir = item.position;
41                 break;
42             }
43         }
44         if (Vector3.Distance(dir, parentCenter) < rockerBg.sizeDelta.x / 2 / ratio)
45         {
46             this.pos = dir;
47         }
48         else
49         {
50             this.localPos = (dir - parentCenter).normalized * rockerBg.sizeDelta.x / 2f;
51         }
52         x = this.localPos.x / parentCenter.x;
53         y = this.localPos.y / parentCenter.y;
54     }
55 
56     /// <summary>
57     /// 当松开摇杆时
58     /// </summary>
59     /// <param name="eventData"></param>
60     public void OnEndDrag(PointerEventData eventData)
61     {
62         this.localPos = Vector3.zero;//让摇杆归位到初始位置
63         x = 0;
64         y = 0;
65     }
66 
67     /// <summary>
68     /// 当点击摇杆时
69     /// </summary>
70     /// <param name="eventData"></param>
71     public void OnBeginDrag(PointerEventData eventData)
72     {
73         touch = Input.touches[Input.touches.Length - 1];
74         a = touch.fingerId;
75     }
76 }
NRE的主页 NRE | 初学一级 | 园豆:169
提问于:2017-12-24 10:54
< >
分享
所有回答(2)
0

通过集合判断三,很明显开始触摸集合点少。

花飘水流兮 | 园豆:10527 (专家六级) | 2017-12-24 17:08

什么意思,能不能麻烦说明白点,没看懂,谢谢!

支持(0) 反对(0) NRE | 园豆:169 (初学一级) | 2017-12-24 18:14

@小玉龙: Input.touches 这不是集合吗。一个跟多个触摸点,拿到的数据集合不一样。

支持(0) 反对(0) 花飘水流兮 | 园豆:10527 (专家六级) | 2017-12-24 19:06

@花飘水流兮: 这个我知道啊,这个属性每调用一次都会获取屏幕上所有手指最后一帧的信息存起来,然后返回一个数组集合,难道我的理解不对?求解惑,怎么才能解决这个手指会互相影响的问题

支持(0) 反对(0) NRE | 园豆:169 (初学一级) | 2017-12-24 19:26

@小玉龙: 

点下一根手指控制摇杆,现在在点下第二根手指,然后松开第一根手指。

对应:集合1[Lenght=1],跟集合2[Lenght=2],集合3[Lenght=1];

这跟跟你判断Click不一样吗,_lastState=Down,_currentState=Up;上面肯定是状态变化的。你慢慢屡一下~

支持(0) 反对(0) 花飘水流兮 | 园豆:10527 (专家六级) | 2017-12-24 20:24
0

谢谢各位了,我已经自己解决了

NRE | 园豆:169 (初学一级) | 2017-12-25 20:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册