質問編集履歴

4

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

2018/11/02 02:00

投稿

funyao
funyao

スコア12

test CHANGED
File without changes
test CHANGED
@@ -370,15 +370,211 @@
370
370
 
371
371
  {
372
372
 
373
+          //略
374
+
375
+ }
376
+
377
+ }
378
+
379
+ }
380
+
381
+ }
382
+
383
+
384
+
385
+ bool OnMoveTouchDown()
386
+
387
+ {
388
+
389
+ if (0 < Input.touchCount)
390
+
391
+ {
392
+
393
+ for (int i = 0; i < Input.touchCount; i++)
394
+
395
+ {
396
+
397
+ Touch t = Input.GetTouch(i);
398
+
399
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
400
+
401
+ {
402
+
403
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
404
+
405
+ //pointer.position = Input.mousePosition; //★ご指摘の箇所★
406
+
407
+ pointer.position = t.position; //上記述から変更
408
+
409
+ //以下、略
410
+
411
+ }
412
+
413
+
414
+
415
+ bool OnRotateTouchDown()
416
+
417
+ {
418
+
419
+ //OnMoveTouchDown()と同様の変更のため、略
420
+
421
+ }
422
+
423
+ }
424
+
425
+ ```
426
+
427
+ ### 追試スクリプト記述(2)
428
+
429
+ タッチ判定の条件付けに原因があると思え、別の方式を試行。
430
+
431
+ nullがちゃんと扱えず、エラー。
432
+
433
+ ```C#
434
+
435
+ //前略
436
+
437
+ void Update()
438
+
439
+ {
440
+
441
+ //“Move~”にタッチしているか
442
+
443
+ Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
444
+
445
+ if (t != null) //Touch?のため、ここは通過
446
+
447
+ {
448
+
449
+ Debug.Log(t); //Touchログが出るが…
450
+
451
+ if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない.エラー
452
+
453
+ {
454
+
455
+ Movestart = t.position;  //'position'同様
456
+
457
+ }
458
+
459
+ //中略
460
+
461
+ }
462
+
463
+
464
+
465
+ //“Rotate~”にタッチしているか
466
+
467
+ Touch? r = OnRotateTouchDown();
468
+
469
+ if (r != null)
470
+
471
+ {
472
+
473
+ //中略
474
+
475
+ }
476
+
477
+ }
478
+
479
+
480
+
481
+ Touch? OnMoveTouchDown()
482
+
483
+ {
484
+
485
+ if (0 < Input.touchCount)
486
+
487
+ {
488
+
489
+ for (int i = 0; i < Input.touchCount; i++)
490
+
491
+ {
492
+
493
+   //中略
494
+
495
+ if (raycastResult.gameObject.tag == "MoveController")
496
+
497
+ {
498
+
499
+ return t;
500
+
501
+ }}}}}
502
+
503
+ return null;
504
+
505
+ }
506
+
507
+
508
+
509
+ Touch? OnRotateTouchDown()
510
+
511
+ {
512
+
513
+ //略
514
+
515
+ }
516
+
517
+ ```
518
+
519
+ ### 解決後の記述(一部、略)
520
+
521
+ ```C#
522
+
523
+ //いろいろ略
524
+
525
+ using UnityEngine.EventSystems;
526
+
527
+
528
+
529
+ void Update()
530
+
531
+ {
532
+
533
+ if (Input.touchCount > 0)
534
+
535
+ {
536
+
537
+ for (int i = 0; i < Input.touchCount; i++)
538
+
539
+ {
540
+
541
+ Touch t = Input.GetTouch(i);
542
+
543
+ if (OnMoveTouchDown(t) == true) //チェック中のTouchを引数で渡す
544
+
545
+ {
546
+
373
547
  if (t.phase == TouchPhase.Began)
374
548
 
375
549
  {
376
550
 
377
- Rostart = t.position; //同様の変更
551
+ Movestart = t.position;
378
-
552
+
379
- }
553
+ }
554
+
380
-
555
+ if (t.phase == TouchPhase.Moved)
556
+
557
+ {
558
+
559
+ Move = t.position;
560
+
561
+ deltaX = (Move - Movestart).x;
562
+
563
+ deltaZ = (Move - Movestart).y;
564
+
565
+ }
566
+
381
-          //
567
+ //略
568
+
569
+ }
570
+
571
+
572
+
573
+ if (OnRotateTouchDown(t) == true) //チェック中のTouchを引数で渡す
574
+
575
+ {
576
+
577
+ //略
382
578
 
383
579
  }
384
580
 
@@ -390,49 +586,33 @@
390
586
 
391
587
 
392
588
 
393
- bool OnMoveTouchDown()
589
+ bool OnMoveTouchDown(Touch t)
590
+
394
-
591
+ { //当初for文を入れていたが、Update内で済ませているので不要
592
+
593
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
594
+
395
- {
595
+ {
596
+
396
-
597
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
598
+
397
- if (0 < Input.touchCount)
599
+ pointer.position = t.position;
600
+
398
-
601
+ List<RaycastResult> result = new List<RaycastResult>();
602
+
603
+ EventSystem.current.RaycastAll(pointer, result);
604
+
605
+
606
+
607
+ foreach (RaycastResult raycastResult in result)
608
+
399
- {
609
+ {
400
-
610
+
401
- for (int i = 0; i < Input.touchCount; i++)
611
+ if (raycastResult.gameObject.tag == "MoveController")
402
-
612
+
403
- {
613
+ {
404
-
405
- Touch t = Input.GetTouch(i);
614
+
406
-
407
- if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
408
-
409
- {
410
-
411
- PointerEventData pointer = new PointerEventData(EventSystem.current);
412
-
413
- //pointer.position = Input.mousePosition; //★ご指摘の箇所★
414
-
415
- pointer.position = t.position; //上記述から変更
416
-
417
- List<RaycastResult> result = new List<RaycastResult>();
418
-
419
- EventSystem.current.RaycastAll(pointer, result);
420
-
421
-
422
-
423
- foreach (RaycastResult raycastResult in result)
424
-
425
- {
426
-
427
- if (raycastResult.gameObject.tag == "MoveController")
428
-
429
- {
430
-
431
- return true;
615
+ return true;
432
-
433
- }
434
-
435
- }
436
616
 
437
617
  }
438
618
 
@@ -446,140 +626,14 @@
446
626
 
447
627
 
448
628
 
449
- bool OnRotateTouchDown()
629
+ bool OnRotateTouchDown(Touch t)
450
-
630
+
451
- {
631
+ {
452
-
632
+
453
- //OnMoveTouchDown()と同様の変更のため、
633
+ //略
454
634
 
455
635
  }
456
636
 
457
637
  }
458
638
 
459
639
  ```
460
-
461
- ### 追試スクリプト記述(2)
462
-
463
- タッチ判定の条件付けに原因があると思え、別の方式を試行。
464
-
465
- nullがちゃんと扱えず、エラー。
466
-
467
- ```C#
468
-
469
- //前略
470
-
471
- void Update()
472
-
473
- {
474
-
475
- //“Move~”にタッチしているか
476
-
477
- Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
478
-
479
- if (t != null) //Touch?のため、ここは通過
480
-
481
- {
482
-
483
- Debug.Log(t); //Touchログが出るが…
484
-
485
- if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない.エラー
486
-
487
- {
488
-
489
- Movestart = t.position;  //'position'同様
490
-
491
- }
492
-
493
- //中略
494
-
495
- }
496
-
497
-
498
-
499
- //“Rotate~”にタッチしているか
500
-
501
- Touch? r = OnRotateTouchDown();
502
-
503
- if (r != null)
504
-
505
- {
506
-
507
- if (r.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
508
-
509
- {
510
-
511
- Rostart = r.position; //'position'同様
512
-
513
- }
514
-
515
- //中略
516
-
517
- }
518
-
519
- }
520
-
521
-
522
-
523
- Touch? OnMoveTouchDown()
524
-
525
- {
526
-
527
- if (0 < Input.touchCount)
528
-
529
- {
530
-
531
- for (int i = 0; i < Input.touchCount; i++)
532
-
533
- {
534
-
535
- Touch t = Input.GetTouch(i);
536
-
537
- if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
538
-
539
- {
540
-
541
- PointerEventData pointer = new PointerEventData(EventSystem.current);
542
-
543
- pointer.position = t.position;
544
-
545
- List<RaycastResult> result = new List<RaycastResult>();
546
-
547
- EventSystem.current.RaycastAll(pointer, result);
548
-
549
-
550
-
551
- foreach (RaycastResult raycastResult in result)
552
-
553
- {
554
-
555
- if (raycastResult.gameObject.tag == "MoveController")
556
-
557
- {
558
-
559
- return t;
560
-
561
- }
562
-
563
- }
564
-
565
- }
566
-
567
- }
568
-
569
- }
570
-
571
- return null;
572
-
573
- }
574
-
575
-
576
-
577
- Touch? OnRotateTouchDown()
578
-
579
- {
580
-
581
- //上記OnMoveTouchDown()とほぼ同様のため、略
582
-
583
- }
584
-
585
- ```

3

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

2018/11/02 02:00

投稿

funyao
funyao

スコア12

test CHANGED
File without changes
test CHANGED
@@ -476,11 +476,13 @@
476
476
 
477
477
  Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
478
478
 
479
- if (t != null)
479
+ if (t != null) //Touch?のため、ここは通過
480
-
480
+
481
- {
481
+ {
482
+
482
-
483
+ Debug.Log(t); //Touchログが出るが…
484
+
483
- if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
485
+ if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない.エラー
484
486
 
485
487
  {
486
488
 

2

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

2018/10/30 10:17

投稿

funyao
funyao

スコア12

test CHANGED
File without changes
test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
   問題があるのがどの部分か判断できず、全記述を掲載させていただきます。当たり前ですが、エラー警告は発生していません。
50
50
 
51
- ```ここに言語を入力
51
+ ```C#
52
52
 
53
53
  using System.Collections;
54
54
 
@@ -315,3 +315,269 @@
315
315
 
316
316
 
317
317
  ※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。
318
+
319
+ ### 追試スクリプト記述(1)
320
+
321
+ この記述の場合、タッチの混同が発生しました。
322
+
323
+ 事例:画面左(-x)のMoveコントローラーで移動動作中、画面右(+x)のRotateコントローラーにタッチする
324
+
325
+ →対象Objが左(-x)に大きく吹っ飛ぶ+新規のデバックログMovestartを確認
326
+
327
+ →条件が一致しないはずの、後発のRotateタッチが、MoveタッチBeganとして判定されている。
328
+
329
+ ```C#
330
+
331
+ //前略
332
+
333
+
334
+
335
+ void Update () {
336
+
337
+ if (Input.touchCount > 0)
338
+
339
+ {
340
+
341
+ for (int i = 0; i < Input.touchCount; i++)
342
+
343
+ {
344
+
345
+ Touch t = Input.GetTouch(i);
346
+
347
+ if (OnMoveTouchDown() == true)
348
+
349
+ {
350
+
351
+ if (t.phase == TouchPhase.Began)
352
+
353
+ {
354
+
355
+ //Movestart = myTouches[i].position; //御回答の指摘と直接関係しないが下に変更
356
+
357
+ Movestart = t.position;
358
+
359
+              Debug.Log("Movestart" + Movestart); //タッチ混同を確認
360
+
361
+ }
362
+
363
+ //中略
364
+
365
+ }
366
+
367
+
368
+
369
+ if (OnRotateTouchDown() == true)
370
+
371
+ {
372
+
373
+ if (t.phase == TouchPhase.Began)
374
+
375
+ {
376
+
377
+ Rostart = t.position; //同様の変更
378
+
379
+ }
380
+
381
+          //中略
382
+
383
+ }
384
+
385
+ }
386
+
387
+ }
388
+
389
+ }
390
+
391
+
392
+
393
+ bool OnMoveTouchDown()
394
+
395
+ {
396
+
397
+ if (0 < Input.touchCount)
398
+
399
+ {
400
+
401
+ for (int i = 0; i < Input.touchCount; i++)
402
+
403
+ {
404
+
405
+ Touch t = Input.GetTouch(i);
406
+
407
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
408
+
409
+ {
410
+
411
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
412
+
413
+ //pointer.position = Input.mousePosition; //★ご指摘の箇所★
414
+
415
+ pointer.position = t.position; //上記述から変更
416
+
417
+ List<RaycastResult> result = new List<RaycastResult>();
418
+
419
+ EventSystem.current.RaycastAll(pointer, result);
420
+
421
+
422
+
423
+ foreach (RaycastResult raycastResult in result)
424
+
425
+ {
426
+
427
+ if (raycastResult.gameObject.tag == "MoveController")
428
+
429
+ {
430
+
431
+ return true;
432
+
433
+ }
434
+
435
+ }
436
+
437
+ }
438
+
439
+ }
440
+
441
+ }
442
+
443
+ return false;
444
+
445
+ }
446
+
447
+
448
+
449
+ bool OnRotateTouchDown()
450
+
451
+ {
452
+
453
+ //OnMoveTouchDown()と同様の変更のため、略
454
+
455
+ }
456
+
457
+ }
458
+
459
+ ```
460
+
461
+ ### 追試スクリプト記述(2)
462
+
463
+ タッチ判定の条件付けに原因があると思え、別の方式を試行。
464
+
465
+ nullがちゃんと扱えず、エラー。
466
+
467
+ ```C#
468
+
469
+ //前略
470
+
471
+ void Update()
472
+
473
+ {
474
+
475
+ //“Move~”にタッチしているか
476
+
477
+ Touch? t = OnMoveTouchDown(); //null許容のためにTouch?に変更
478
+
479
+ if (t != null)
480
+
481
+ {
482
+
483
+ if (t.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
484
+
485
+ {
486
+
487
+ Movestart = t.position;  //'position'同様
488
+
489
+ }
490
+
491
+ //中略
492
+
493
+ }
494
+
495
+
496
+
497
+ //“Rotate~”にタッチしているか
498
+
499
+ Touch? r = OnRotateTouchDown();
500
+
501
+ if (r != null)
502
+
503
+ {
504
+
505
+ if (r.phase == TouchPhase.Began) //'phase'がTouch?に含まれていない
506
+
507
+ {
508
+
509
+ Rostart = r.position; //'position'同様
510
+
511
+ }
512
+
513
+ //中略
514
+
515
+ }
516
+
517
+ }
518
+
519
+
520
+
521
+ Touch? OnMoveTouchDown()
522
+
523
+ {
524
+
525
+ if (0 < Input.touchCount)
526
+
527
+ {
528
+
529
+ for (int i = 0; i < Input.touchCount; i++)
530
+
531
+ {
532
+
533
+ Touch t = Input.GetTouch(i);
534
+
535
+ if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
536
+
537
+ {
538
+
539
+ PointerEventData pointer = new PointerEventData(EventSystem.current);
540
+
541
+ pointer.position = t.position;
542
+
543
+ List<RaycastResult> result = new List<RaycastResult>();
544
+
545
+ EventSystem.current.RaycastAll(pointer, result);
546
+
547
+
548
+
549
+ foreach (RaycastResult raycastResult in result)
550
+
551
+ {
552
+
553
+ if (raycastResult.gameObject.tag == "MoveController")
554
+
555
+ {
556
+
557
+ return t;
558
+
559
+ }
560
+
561
+ }
562
+
563
+ }
564
+
565
+ }
566
+
567
+ }
568
+
569
+ return null;
570
+
571
+ }
572
+
573
+
574
+
575
+ Touch? OnRotateTouchDown()
576
+
577
+ {
578
+
579
+ //上記OnMoveTouchDown()とほぼ同様のため、略
580
+
581
+ }
582
+
583
+ ```

1

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

2018/10/30 09:48

投稿

funyao
funyao

スコア12

test CHANGED
File without changes
test CHANGED
@@ -311,3 +311,7 @@
311
311
  ### 追記
312
312
 
313
313
  「根本的におめーの学習が足りてないだろ」というご指摘は避けられませんので、「ここを見ろ」「あれを読め」というだけのご回答でもありがたいです。
314
+
315
+
316
+
317
+ ※同一の質問で二重投稿してしまい、こちらを残し、一方を削除依頼しております。