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

質問編集履歴

4

解決後、修正済み記述を掲載。

2018/11/02 02:00

投稿

funyao
funyao

スコア12

title CHANGED
File without changes
body CHANGED
@@ -184,11 +184,7 @@
184
184
 
185
185
  if (OnRotateTouchDown() == true)
186
186
  {
187
- if (t.phase == TouchPhase.Began)
188
- {
189
- Rostart = t.position; //同様の変更
190
- }
191
-          //
187
+          //略
192
188
  }
193
189
  }
194
190
  }
@@ -206,20 +202,7 @@
206
202
  PointerEventData pointer = new PointerEventData(EventSystem.current);
207
203
  //pointer.position = Input.mousePosition; //★ご指摘の箇所★
208
204
  pointer.position = t.position; //上記述から変更
209
- List<RaycastResult> result = new List<RaycastResult>();
210
- EventSystem.current.RaycastAll(pointer, result);
211
-
212
- foreach (RaycastResult raycastResult in result)
213
- {
214
- if (raycastResult.gameObject.tag == "MoveController")
215
- {
216
- return true;
205
+ //以下、略
217
- }
218
- }
219
- }
220
- }
221
- }
222
- return false;
223
206
  }
224
207
 
225
208
  bool OnRotateTouchDown()
@@ -251,10 +234,6 @@
251
234
  Touch? r = OnRotateTouchDown();
252
235
  if (r != null)
253
236
  {
254
- if (r.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
255
- {
256
- Rostart = r.position; //'position'同様
257
- }
258
237
  //中略
259
238
  }
260
239
  }
@@ -265,29 +244,77 @@
265
244
  {
266
245
  for (int i = 0; i < Input.touchCount; i++)
267
246
  {
247
+   //中略
248
+ if (raycastResult.gameObject.tag == "MoveController")
249
+ {
250
+ return t;
251
+ }}}}}
252
+ return null;
253
+ }
254
+
255
+ Touch? OnRotateTouchDown()
256
+ {
257
+ //略
258
+ }
259
+ ```
260
+ ### 解決後の記述(一部、略)
261
+ ```C#
262
+ //いろいろ略
263
+ using UnityEngine.EventSystems;
264
+
265
+ void Update()
266
+ {
267
+ if (Input.touchCount > 0)
268
+ {
269
+ for (int i = 0; i < Input.touchCount; i++)
270
+ {
268
271
  Touch t = Input.GetTouch(i);
269
- if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
272
+ if (OnMoveTouchDown(t) == true) //チェック中のTouchを引数で渡す
270
273
  {
271
- PointerEventData pointer = new PointerEventData(EventSystem.current);
272
- pointer.position = t.position;
274
+ if (t.phase == TouchPhase.Began)
273
- List<RaycastResult> result = new List<RaycastResult>();
274
- EventSystem.current.RaycastAll(pointer, result);
275
-
276
- foreach (RaycastResult raycastResult in result)
277
275
  {
278
- if (raycastResult.gameObject.tag == "MoveController")
279
- {
280
- return t;
276
+ Movestart = t.position;
281
- }
282
277
  }
278
+ if (t.phase == TouchPhase.Moved)
279
+ {
280
+ Move = t.position;
281
+ deltaX = (Move - Movestart).x;
282
+ deltaZ = (Move - Movestart).y;
283
+ }
284
+ //略
283
285
  }
286
+
287
+ if (OnRotateTouchDown(t) == true) //チェック中のTouchを引数で渡す
288
+ {
289
+ //略
290
+ }
284
291
  }
285
292
  }
286
- return null;
287
293
  }
288
294
 
295
+ bool OnMoveTouchDown(Touch t)
296
+ { //当初for文を入れていたが、Update内で済ませているので不要
297
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
298
+ {
299
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
300
+ pointer.position = t.position;
301
+ List<RaycastResult> result = new List<RaycastResult>();
302
+ EventSystem.current.RaycastAll(pointer, result);
303
+
304
+ foreach (RaycastResult raycastResult in result)
305
+ {
306
+ if (raycastResult.gameObject.tag == "MoveController")
307
+ {
308
+ return true;
309
+ }
310
+ }
311
+ }
312
+ return false;
313
+ }
314
+
289
- Touch? OnRotateTouchDown()
315
+ bool OnRotateTouchDown(Touch t)
290
316
  {
291
- //上記OnMoveTouchDown()とほぼ同様のため、
317
+ //略
292
318
  }
319
+ }
293
320
  ```

3

追試スクリプト記述(2):微修正

2018/11/02 02:00

投稿

funyao
funyao

スコア12

title CHANGED
File without changes
body CHANGED
@@ -237,9 +237,10 @@
237
237
  {
238
238
  //“Move~”にタッチしているか
239
239
  Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
240
- if (t != null)
240
+ if (t != null) //Touch?のため、ここは通過
241
241
  {
242
+ Debug.Log(t); //Touchログが出るが…
242
- if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
243
+ if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない.エラー
243
244
  {
244
245
  Movestart = t.position;  //'position'同様
245
246
  }

2

回答に合わせて追試記述(1)+(2)

2018/10/30 10:17

投稿

funyao
funyao

スコア12

title CHANGED
File without changes
body CHANGED
@@ -23,7 +23,7 @@
23
23
  ### 問題のスクリプト
24
24
   以下は、動作させるオブジェクトにアタッチしているスクリプトです。
25
25
   問題があるのがどの部分か判断できず、全記述を掲載させていただきます。当たり前ですが、エラー警告は発生していません。
26
- ```ここに言語を入力
26
+ ```C#
27
27
  using System.Collections;
28
28
  using System.Collections.Generic;
29
29
  using UnityEngine;
@@ -156,4 +156,137 @@
156
156
  ### 追記
157
157
  「根本的におめーの学習が足りてないだろ」というご指摘は避けられませんので、「ここを見ろ」「あれを読め」というだけのご回答でもありがたいです。
158
158
 
159
- ※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。
159
+ ※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。
160
+ ### 追試スクリプト記述(1)
161
+ この記述の場合、タッチの混同が発生しました。
162
+ 事例:画面左(-x)のMoveコントローラーで移動動作中、画面右(+x)のRotateコントローラーにタッチする
163
+ →対象Objが左(-x)に大きく吹っ飛ぶ+新規のデバックログMovestartを確認
164
+ →条件が一致しないはずの、後発のRotateタッチが、MoveタッチBeganとして判定されている。
165
+ ```C#
166
+ //前略
167
+
168
+ void Update () {
169
+ if (Input.touchCount > 0)
170
+ {
171
+ for (int i = 0; i < Input.touchCount; i++)
172
+ {
173
+ Touch t = Input.GetTouch(i);
174
+ if (OnMoveTouchDown() == true)
175
+ {
176
+ if (t.phase == TouchPhase.Began)
177
+ {
178
+ //Movestart = myTouches[i].position; //御回答の指摘と直接関係しないが下に変更
179
+ Movestart = t.position;
180
+              Debug.Log("Movestart" + Movestart); //タッチ混同を確認
181
+ }
182
+ //中略
183
+ }
184
+
185
+ if (OnRotateTouchDown() == true)
186
+ {
187
+ if (t.phase == TouchPhase.Began)
188
+ {
189
+ Rostart = t.position; //同様の変更
190
+ }
191
+          //中略
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ bool OnMoveTouchDown()
198
+ {
199
+ if (0 < Input.touchCount)
200
+ {
201
+ for (int i = 0; i < Input.touchCount; i++)
202
+ {
203
+ Touch t = Input.GetTouch(i);
204
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
205
+ {
206
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
207
+ //pointer.position = Input.mousePosition; //★ご指摘の箇所★
208
+ pointer.position = t.position; //上記述から変更
209
+ List<RaycastResult> result = new List<RaycastResult>();
210
+ EventSystem.current.RaycastAll(pointer, result);
211
+
212
+ foreach (RaycastResult raycastResult in result)
213
+ {
214
+ if (raycastResult.gameObject.tag == "MoveController")
215
+ {
216
+ return true;
217
+ }
218
+ }
219
+ }
220
+ }
221
+ }
222
+ return false;
223
+ }
224
+
225
+ bool OnRotateTouchDown()
226
+ {
227
+ //OnMoveTouchDown()と同様の変更のため、略
228
+ }
229
+ }
230
+ ```
231
+ ### 追試スクリプト記述(2)
232
+ タッチ判定の条件付けに原因があると思え、別の方式を試行。
233
+ nullがちゃんと扱えず、エラー。
234
+ ```C#
235
+ //前略
236
+ void Update()
237
+ {
238
+ //“Move~”にタッチしているか
239
+ Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
240
+ if (t != null)
241
+ {
242
+ if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
243
+ {
244
+ Movestart = t.position;  //'position'同様
245
+ }
246
+ //中略
247
+ }
248
+
249
+ //“Rotate~”にタッチしているか
250
+ Touch? r = OnRotateTouchDown();
251
+ if (r != null)
252
+ {
253
+ if (r.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
254
+ {
255
+ Rostart = r.position; //'position'同様
256
+ }
257
+ //中略
258
+ }
259
+ }
260
+
261
+ Touch? OnMoveTouchDown()
262
+ {
263
+ if (0 < Input.touchCount)
264
+ {
265
+ for (int i = 0; i < Input.touchCount; i++)
266
+ {
267
+ Touch t = Input.GetTouch(i);
268
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
269
+ {
270
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
271
+ pointer.position = t.position;
272
+ List<RaycastResult> result = new List<RaycastResult>();
273
+ EventSystem.current.RaycastAll(pointer, result);
274
+
275
+ foreach (RaycastResult raycastResult in result)
276
+ {
277
+ if (raycastResult.gameObject.tag == "MoveController")
278
+ {
279
+ return t;
280
+ }
281
+ }
282
+ }
283
+ }
284
+ }
285
+ return null;
286
+ }
287
+
288
+ Touch? OnRotateTouchDown()
289
+ {
290
+ //上記OnMoveTouchDown()とほぼ同様のため、略
291
+ }
292
+ ```

1

同一質問の二重投稿について説明。

2018/10/30 09:48

投稿

funyao
funyao

スコア12

title CHANGED
File without changes
body CHANGED
@@ -154,4 +154,6 @@
154
154
  タッチBeganとEndedでONOFFするboolを管理すれば、「後発のタッチで先発の動作が停止」することはないだろうと試しました。動作の停止はなくなりましたが、結局は条件内でタッチが混同して、移動と回転がぶっ飛ぶことになりました。
155
155
  今後もタッチによる他動作が加わる余地を考えると、タッチの判別ができる記述と知識が必要だろうと思い、質問を投稿した次第です。
156
156
  ### 追記
157
- 「根本的におめーの学習が足りてないだろ」というご指摘は避けられませんので、「ここを見ろ」「あれを読め」というだけのご回答でもありがたいです。
157
+ 「根本的におめーの学習が足りてないだろ」というご指摘は避けられませんので、「ここを見ろ」「あれを読め」というだけのご回答でもありがたいです。
158
+
159
+ ※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。