回答編集履歴

1 修正案を追記

sakura_hana

sakura_hana score 10853

2018/10/30 22:47  投稿

どちらもタッチ位置の取得が
`pointer.position = Input.mousePosition;`
なので、(Unityの仕様上どっちか分かりませんが)先か後、どっちかのタッチのみが衝突判定に使われているものと思います。
とりあえず以下にすれば干渉は起こらないんじゃないかと。
`pointer.position = t.position;`
おまけですが、OnMoveTouchDownとOnRotateTouchDownの返り値をTouch型にする(該当のオブジェクトに当たっていなかったらnull返す)とUpdate内のfor文が無くなってちょっとスマートかと。
```C#
void Update () {
       //“Move~”にタッチしているか
       Touch t = OnMoveTouchDown();
       if (t != null)
       {
               if (t.phase == TouchPhase.Began)
               {
                       Movestart = t.position; //myTouches[i]の代わりにtを使う
               }
       //中略
       }
       //“Rotate~”にタッチしているか
       Touch t = OnRotateTouchDown();
       if (t != null)
       {
               if (t.phase == TouchPhase.Began)
               {
                       Rostart = t.position; //myTouches[i]の代わりにtを使う
               }
       //中略
       }
}
```  
 
---  
 
(2018/10/30追記)  
すいません、大分思い違いしてました。  
`pointer.position = t.position;`にするだけだとやっぱり干渉します。  
 
例えば`Touch[0]がMove側にタッチ、Touch[1]がRotate側にタッチ`しているとしたら、現状の処理は以下のようになります。  
 
```  
Update:for文1回目 i=0  
OnMoveTouchDown:for文1回目→[0]の判定開始、trueを返す  
Update:Touch[0]を元に移動処理実行  
OnRotateTouchDown:for文1回目→[0]の判定開始、条件を満たさない  
OnRotateTouchDown:for文2回目→[1]の判定開始、trueを返す  
Update:Touch[0]を元に回転処理実行  
 
Update:for文2回目 i=1  
OnMoveTouchDown:for文1回目→[0]の判定開始、trueを返す  
Update:Touch[1]を元に移動処理実行  
OnRotateTouchDown:for文1回目→[0]の判定開始、条件を満たさない  
OnRotateTouchDown:for文2回目→[1]の判定開始、trueを返す  
Update:Touch[1]を元に回転処理実行  
```  
 
つまり「Updateのforループ1回につき、全タッチの確認をしてしまっている」ので条件が狂う訳です。  
 
そしてTouchってNull許容してないんですね、未確認で申し訳無いです。  
よくよく考えればUpdateで対象のTouchは1つずつ取得してるんですから、そいつをそのまま衝突判定に使えばいいだけでした。  
という訳で修正版が以下です。  
 
```C#  
void Update () {  
       if (Input.touchCount > 0)  
       {  
           for (int i = 0; i < Input.touchCount; i++)  
           {  
               Touch t = Input.GetTouch(i);  
               if (OnMoveTouchDown(t) == true) //チェック中のTouchを引数で渡す  
               {  
                   if (t.phase == TouchPhase.Began)  
                   {  
                       Movestart = t.position;  
             Debug.Log("Movestart" + Movestart); //タッチ混同を確認  
                   }  
               //中略   
               }  
 
               if (OnRotateTouchDown(t) == true) //チェック中のTouchを引数で渡す  
               {  
                   if (t.phase == TouchPhase.Began)  
                   {  
                       Rostart = t.position; //同様の変更  
                   }  
         //中略  
               }  
           }  
       }  
}  
 
bool OnMoveTouchDown(Touch t) {  
       if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)  
       {  
               PointerEventData pointer = new PointerEventData(EventSystem.current);  
               pointer.position = t.position; //上記述から変更  
               List<RaycastResult> result = new List<RaycastResult>();  
               EventSystem.current.RaycastAll(pointer, result);  
 
               foreach (RaycastResult raycastResult in result)  
               {  
                       if (raycastResult.gameObject.tag == "MoveController")  
                       {  
                           return true;  
                       }  
               }  
       }  
       return false;  
}  
 
//OnRotateTouchDownは省略  
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る