teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正案を追記

2018/10/30 13:47

投稿

sakura_hana
sakura_hana

スコア11429

answer CHANGED
@@ -31,4 +31,85 @@
31
31
  //中略
32
32
  }
33
33
  }
34
+ ```
35
+
36
+ ---
37
+
38
+ (2018/10/30追記)
39
+ すいません、大分思い違いしてました。
40
+ `pointer.position = t.position;`にするだけだとやっぱり干渉します。
41
+
42
+ 例えば`Touch[0]がMove側にタッチ、Touch[1]がRotate側にタッチ`しているとしたら、現状の処理は以下のようになります。
43
+
44
+ ```
45
+ Update:for文1回目 i=0
46
+ OnMoveTouchDown:for文1回目→[0]の判定開始、trueを返す
47
+ Update:Touch[0]を元に移動処理実行
48
+ OnRotateTouchDown:for文1回目→[0]の判定開始、条件を満たさない
49
+ OnRotateTouchDown:for文2回目→[1]の判定開始、trueを返す
50
+ Update:Touch[0]を元に回転処理実行
51
+
52
+ Update:for文2回目 i=1
53
+ OnMoveTouchDown:for文1回目→[0]の判定開始、trueを返す
54
+ Update:Touch[1]を元に移動処理実行
55
+ OnRotateTouchDown:for文1回目→[0]の判定開始、条件を満たさない
56
+ OnRotateTouchDown:for文2回目→[1]の判定開始、trueを返す
57
+ Update:Touch[1]を元に回転処理実行
58
+ ```
59
+
60
+ つまり「Updateのforループ1回につき、全タッチの確認をしてしまっている」ので条件が狂う訳です。
61
+
62
+ そしてTouchってNull許容してないんですね、未確認で申し訳無いです。
63
+ よくよく考えればUpdateで対象のTouchは1つずつ取得してるんですから、そいつをそのまま衝突判定に使えばいいだけでした。
64
+ という訳で修正版が以下です。
65
+
66
+ ```C#
67
+ void Update () {
68
+ if (Input.touchCount > 0)
69
+ {
70
+ for (int i = 0; i < Input.touchCount; i++)
71
+ {
72
+ Touch t = Input.GetTouch(i);
73
+ if (OnMoveTouchDown(t) == true) //チェック中のTouchを引数で渡す
74
+ {
75
+ if (t.phase == TouchPhase.Began)
76
+ {
77
+ Movestart = t.position;
78
+              Debug.Log("Movestart" + Movestart); //タッチ混同を確認
79
+ }
80
+ //中略
81
+ }
82
+
83
+ if (OnRotateTouchDown(t) == true) //チェック中のTouchを引数で渡す
84
+ {
85
+ if (t.phase == TouchPhase.Began)
86
+ {
87
+ Rostart = t.position; //同様の変更
88
+ }
89
+          //中略
90
+ }
91
+ }
92
+ }
93
+ }
94
+
95
+ bool OnMoveTouchDown(Touch t) {
96
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
97
+ {
98
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
99
+ pointer.position = t.position; //上記述から変更
100
+ List<RaycastResult> result = new List<RaycastResult>();
101
+ EventSystem.current.RaycastAll(pointer, result);
102
+
103
+ foreach (RaycastResult raycastResult in result)
104
+ {
105
+ if (raycastResult.gameObject.tag == "MoveController")
106
+ {
107
+ return true;
108
+ }
109
+ }
110
+ }
111
+ return false;
112
+ }
113
+
114
+ //OnRotateTouchDownは省略
34
115
  ```