質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3154閲覧

Input.touchesの順番があがるため、移動がワープされてしまう

Yukirr4_

総合スコア728

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/01/08 09:32

編集2021/01/08 10:34

#はじめに

現在モバイル向けにスワイプ操作でカメラを移動させる処理を実装しています。
スワイプ処理自体は一本の指であればうまくいくのですが、2本目の指を使ってしまうとワープされます。

これはおそらく1本目の指(Input.touches[0])を先に画面タップを開始して、それを画面に触れたまま二本目の指Input.touches[1]を画面に触れさせた時、先にInput.touches[0]を画面から離してしまうと二本目の指がInput.touches[0]として登録されてしまうため起こってしまうと思います。

#わからないこと

しかし、僕は二本目の指を画面から離したときの処理の仕方がわかりません。

Input.touches[1].phaze == TouchPhase.Endedこれは離した「瞬間」ではなく、触れていない「状態」の時trueを返すので使えません。
Input.GetMouseButtonUp()のような機能がタッチ処理にも存在していればいいのですが...

#コード

C#

1 Camera Cam; 2 Vector2 lastPos; 3 4 void Update() 5 { 6 Move(); 7 } 8 9 void Move() 10 { 11 Vector2 currentPos; 12 13 //指の数が2本以上、もしくは触れていないときはスルー 14 if (Input.touchCount >= 2 || Input.touchCount <= 0) 15 return; 16 17 //一本目の指の位置 18 currentPos = Input.touches[0].position; 19 20 Debug.Log(currentPos); 21 22 //初めて一本目が触れたとき1フレーム前の位置を現在地に上書き 23 if (Input.touches[0].phase == TouchPhase.Began) 24 lastPos = currentPos; 25 26 //差を取得 27 float x = lastpos.x - currentPos.x; 28 float y = lastPos.y - currentPos.y; 29 30 //実際に移動 31 Cam.transform.position += new Vector3(x, y, 0) * CamSensi * Cam.orthographicSize / 5 * Time.deltaTime; 32 33 //次フレームのために入れておく 34 lastPos = currentPos; 35

#デバッグ結果

コード中にあるDebug.Log()の数字はやはり、指が一本の場合その位置が正しく表示されます。
しかし、二本目の指をつけながら一本目の指を離すと二本目の指の位置がデバッグされます。
(あたりまえではありますが...)


これだと先に1本目の指を離すとInput.touches[]の順番が上がってしまい、2本目の指が1本目の指と思われてしまいます。

どのようにすればワープせずに検知できるでしょうか。

どなたか回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Touch.fingerIdで指の識別子が取れるので、それで判断してください。

cs

1using UnityEngine; 2using System.Collections; 3 4// タッチした位置にSpriteを表示する 5public class Test01 : MonoBehaviour { 6 public SpriteRenderer[] renderers = new SpriteRenderer[2]; 7 int[] fingerIds; 8 9 void Start() 10 { 11 this.fingerIds = new int[this.renderers.Length]; 12 for (int i = 0; i < this.renderers.Length; ++i) { 13 this.fingerIds[i] = -1; 14 this.renderers[i].enabled = false; 15 } 16 } 17 18 void Update() 19 { 20 Camera camera = Camera.main; 21 for (int i = 0; i < Input.touchCount; ++i) { 22 Touch touch = Input.GetTouch(i); 23 int unused = -1; 24 int index = -1; 25 // fingerIdを元に、前回使用したRendererを探す。ついでに、未使用のRendererも探す。 26 for (int j = 0; j < this.fingerIds.Length; ++j) { 27 if (this.fingerIds[j] == touch.fingerId) { 28 index = j; 29 } 30 else if (this.fingerIds[j] < 0) { 31 unused = j; 32 } 33 } 34 // 前回使用したRendererがなければ、未使用を割り当てる。 35 if (index < 0 && unused >= 0) { 36 index = unused; 37 this.fingerIds[index] = touch.fingerId; 38 this.renderers[index].enabled = true; 39 } 40 // Rendererの位置更新 41 if (index >= 0) { 42 this.renderers[index].transform.position = camera.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y, 10.0f)); 43 } 44 } 45 46 // 前回までタッチされていて、タッチされなくなった物を探して、非表示にする。 47 for (int i = 0; i < this.fingerIds.Length; ++i) { 48 bool found = false; 49 for (int j = 0; j < Input.touchCount; ++j) { 50 if (Input.GetTouch(j).fingerId == this.fingerIds[i]) { 51 found = true; 52 break; 53 } 54 } 55 if (!found) { 56 this.renderers[i].enabled = false; 57 this.fingerIds[i] = -1; 58 } 59 } 60 } 61} 62

投稿2021/01/08 12:50

katsuko

総合スコア3538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問