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

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

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

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

Q&A

解決済

1回答

254閲覧

スマホゲーで敵に当たると指定した場所に移動(transform)したいのですが指が画面に触れ続けているとtransformしてくれません。

giftVS

総合スコア19

C#

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

0グッド

0クリップ

投稿2018/12/02 11:34

unity C#
タッチ(クリック)でキャラクターが移動するスクリプトを作り、
そのキャラクターが特定のタグを持つオブジェクトに接触すると指定した場所に移動するスクリプトを作りたいのですが。
タッチ(クリック)し続けている間はtransformが有効化されません。一度指を話せばtransformしてくれます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class RocketBoss : MonoBehaviour 6{ 7 private Vector3 playerPos; 8 private Vector3 mousePos; 9 10 void Update() 11 { 12 playerControl(); 13 } 14 15 private void playerControl() 16 { 17 18 if (Input.GetMouseButtonDown(0)) 19 { 20 playerPos = this.transform.position; 21 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 22 } 23 24 if (Input.GetMouseButton(0)) 25 { 26 27 Vector3 prePos = this.transform.position; 28 Vector3 diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - mousePos; 29 30 if (Input.touchSupported) 31 { 32 diff = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position) - mousePos; 33 } 34 35 diff.z = 0.0f; 36 this.transform.position = playerPos + diff; 37 38 } 39 40 if (Input.GetMouseButtonUp(0)) 41 { 42 playerPos = Vector3.zero; 43 mousePos = Vector3.zero; 44 } 45 } 46 47 private void OnCollisionEnter2D(Collision2D collision) 48 { 49 if (collision.gameObject.tag == "Boss") 50 { 51 52 53 transform.position = new Vector3(0, -4, 0); 54 55 56 57 Debug.Log("可動"); 58 59 } 60 61 62 } 63}

解決策としてはおそらく画面のタッチそのものを一瞬だけ無効かする、もしくは強制的なtransformなのかなと思っていますが方法がわかりません。unity初心者で初めての質問です。無作法があると思いますが知恵を貸していただけたら幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

if (Input.GetMouseButton(0)){ ... this.transform.position = playerPos + diff; }

ここで、playerPos と diff を足して新しい座標としています
playerPos はタッチを開始したプレイヤーの座標ですから、
いくらワープしてもここの処理のせいで元の位置に戻されます

したがって、ワープしたときにplayerPos も更新する必要があります

ですが、ワープして直ぐに移動を始めるのも割りと不親切なので、
ワープした直後は一旦画面を離して再度押すまで無効化するのがよいかもしれません

投稿2018/12/03 01:16

izmktr

総合スコア2856

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

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

giftVS

2018/12/06 13:27

ご回答ありがとうございます。以下のようにplayerPosも更新するようにしたのですが。指が触れている間は移動してくれません。ほかにもいろいろ試しましたがうまくいきません。 指を画面から離さず移動させるには衝突判定が入ったときに一瞬だけ画面全体の入力を無効にすればうまくいくのかなと素人ながらに考えているのですがどのように書けばいいかわかりません。 せっかくの助言を活かせず本当に申し訳ないです。 ```C# using System.Collections; using System.Collections.Generic; using UnityEngine; public class RocketBoss : MonoBehaviour { private Vector3 playerPos; private Vector3 mousePos; void Update() { playerControl(); } private void playerControl() { if (Input.GetMouseButtonDown(0)) { playerPos = this.transform.position; mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); } if (Input.GetMouseButton(0)) { Vector3 prePos = this.transform.position; Vector3 diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - mousePos; if (Input.touchSupported) { diff = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position) - mousePos; } diff.z = 0.0f; this.transform.position = playerPos + diff; } if (Input.GetMouseButtonUp(0)) { playerPos = Vector3.zero; mousePos = Vector3.zero; } } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "Boss") { GameObject.Find("Canvas").GetComponent<nekomantoUI>().SubScore(); playerPos =new Vector3(0,-4,0);//ここを追加しました// transform.position = new Vector3(0, -4, 0); Debug.Log("可動"); } } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問