回答編集履歴

1

修正案を追記

2018/10/30 13:47

投稿

sakura_hana
sakura_hana

スコア11427

test CHANGED
@@ -65,3 +65,165 @@
65
65
  }
66
66
 
67
67
  ```
68
+
69
+
70
+
71
+ ---
72
+
73
+
74
+
75
+ (2018/10/30追記)
76
+
77
+ すいません、大分思い違いしてました。
78
+
79
+ `pointer.position = t.position;`にするだけだとやっぱり干渉します。
80
+
81
+
82
+
83
+ 例えば`Touch[0]がMove側にタッチ、Touch[1]がRotate側にタッチ`しているとしたら、現状の処理は以下のようになります。
84
+
85
+
86
+
87
+ ```
88
+
89
+ Update:for文1回目 i=0
90
+
91
+ OnMoveTouchDown:for文1回目→[0]の判定開始、trueを返す
92
+
93
+ Update:Touch[0]を元に移動処理実行
94
+
95
+ OnRotateTouchDown:for文1回目→[0]の判定開始、条件を満たさない
96
+
97
+ OnRotateTouchDown:for文2回目→[1]の判定開始、trueを返す
98
+
99
+ Update:Touch[0]を元に回転処理実行
100
+
101
+
102
+
103
+ Update:for文2回目 i=1
104
+
105
+ OnMoveTouchDown:for文1回目→[0]の判定開始、trueを返す
106
+
107
+ Update:Touch[1]を元に移動処理実行
108
+
109
+ OnRotateTouchDown:for文1回目→[0]の判定開始、条件を満たさない
110
+
111
+ OnRotateTouchDown:for文2回目→[1]の判定開始、trueを返す
112
+
113
+ Update:Touch[1]を元に回転処理実行
114
+
115
+ ```
116
+
117
+
118
+
119
+ つまり「Updateのforループ1回につき、全タッチの確認をしてしまっている」ので条件が狂う訳です。
120
+
121
+
122
+
123
+ そしてTouchってNull許容してないんですね、未確認で申し訳無いです。
124
+
125
+ よくよく考えればUpdateで対象のTouchは1つずつ取得してるんですから、そいつをそのまま衝突判定に使えばいいだけでした。
126
+
127
+ という訳で修正版が以下です。
128
+
129
+
130
+
131
+ ```C#
132
+
133
+ void Update () {
134
+
135
+ if (Input.touchCount > 0)
136
+
137
+ {
138
+
139
+ for (int i = 0; i < Input.touchCount; i++)
140
+
141
+ {
142
+
143
+ Touch t = Input.GetTouch(i);
144
+
145
+ if (OnMoveTouchDown(t) == true) //チェック中のTouchを引数で渡す
146
+
147
+ {
148
+
149
+ if (t.phase == TouchPhase.Began)
150
+
151
+ {
152
+
153
+ Movestart = t.position;
154
+
155
+              Debug.Log("Movestart" + Movestart); //タッチ混同を確認
156
+
157
+ }
158
+
159
+ //中略
160
+
161
+ }
162
+
163
+
164
+
165
+ if (OnRotateTouchDown(t) == true) //チェック中のTouchを引数で渡す
166
+
167
+ {
168
+
169
+ if (t.phase == TouchPhase.Began)
170
+
171
+ {
172
+
173
+ Rostart = t.position; //同様の変更
174
+
175
+ }
176
+
177
+          //中略
178
+
179
+ }
180
+
181
+ }
182
+
183
+ }
184
+
185
+ }
186
+
187
+
188
+
189
+ bool OnMoveTouchDown(Touch t) {
190
+
191
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
192
+
193
+ {
194
+
195
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
196
+
197
+ pointer.position = t.position; //上記述から変更
198
+
199
+ List<RaycastResult> result = new List<RaycastResult>();
200
+
201
+ EventSystem.current.RaycastAll(pointer, result);
202
+
203
+
204
+
205
+ foreach (RaycastResult raycastResult in result)
206
+
207
+ {
208
+
209
+ if (raycastResult.gameObject.tag == "MoveController")
210
+
211
+ {
212
+
213
+ return true;
214
+
215
+ }
216
+
217
+ }
218
+
219
+ }
220
+
221
+ return false;
222
+
223
+ }
224
+
225
+
226
+
227
+ //OnRotateTouchDownは省略
228
+
229
+ ```