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

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

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

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

Unity

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

Q&A

解決済

1回答

4673閲覧

マウスを動かしてもInput.mousePositionで出力される座標が変化しない

MikanChan

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2020/11/28 13:18

前提・実現したいこと

オブジェクトをクリックしたらマウスに追従するスクリプトを作成しています。
押下されたWorld座標を開始座標とし、押下されている間、Update()関数で開始座標の差分だけオブジェクトを動かすという方法で実装したいのですが、Input.mousePositionの座標がマウスを動かしても変化しないため差分がうまくとれません。
どのように改善すれば、Input.mousePositionの座標がうまくとれるでしょうか。

発生している問題・エラーメッセージ

マウスを動かしても、Input.mousePositionの値が画像のようにずっと同じで出力されてしまいます。
イメージ説明

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine.EventSystems; // 追加 4using UnityEngine; 5 6// IPointerClickHandlerを追加する 7public class Move : MonoBehaviour, IPointerDownHandler, IPointerUpHandler 8{ 9 private bool _isPushed = false; // マウスが押されているか押されていないか 10 private Vector3 _nowMousePosi; // 現在のマウスのワールド座標 11 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 Vector3 nowmouseposi; 23 Vector3 diffposi; 24 25 // マウスが押下されている時、オブジェクトを動かす 26 if (_isPushed) 27 { 28 //Debug.Log("マウスが押されています。"); 29 // 現在のマウスのワールド座標を取得 30 nowmouseposi = Camera.main.ScreenToWorldPoint(Input.mousePosition); 31 //Debug.Log("nowmouseposi" + nowmouseposi); 32 Debug.Log("ScreenToWorldPoint" + Camera.main.ScreenToWorldPoint(Input.mousePosition)); 33 // 一つ前のマウス座標との差分を計算して変化量を取得 34 //Debug.Log("_nowMousePosi" + _nowMousePosi); 35 diffposi = nowmouseposi - _nowMousePosi; 36 // Y成分のみ変化させる 37 diffposi.x = 0; 38 diffposi.z = 0; 39 // 開始時のオブジェクトの座標にマウスの変化量を足して新しい座標を設定 40 //Debug.Log(GetComponent<Transform>()); 41 //Debug.Log("diffposi" + diffposi); 42 GetComponent<Transform>().position += diffposi; 43 // 現在のマウスのワールド座標を更新 44 _nowMousePosi = nowmouseposi; 45 } 46 } 47 48 public void OnPointerDown(PointerEventData eventData) 49 { 50 //Debug.Log("マウスが押されました"); 51 // 押下開始 フラグを立てる 52 _isPushed = true; 53 // マウスのワールド座標を保存 54 _nowMousePosi = Camera.main.ScreenToWorldPoint(Input.mousePosition); 55 } 56 57 public void OnPointerUp(PointerEventData eventData) 58 { 59 //Debug.Log("マウスが離されました"); 60 // 押下終了 フラグを落とす 61 _isPushed = false; 62 _nowMousePosi = Vector3.zero; 63 } 64}

補足情報(FW/ツールのバージョンなど)

こちらの記事を参考にしています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じ2次元スクリーン座標に来るワールド座標は一つではありません。カメラから見て直線上に位置する座標はすべて同じ2次元スクリーン座標になるからです。
なので、Camera.ScreenToWorldPointはXYの2次元スクリーン座標に加えてZでカメラからの奥行きも考慮して座標を算出します。
そのコードではZを指定していないので、Zは0になっています。Zが0ってことはカメラからの奥行きが0ってことなので、2次元スクリーン座標がどこだろうとワールド座標はカメラの座標と同じになります。

Camera.ScreenToWorldPointに渡すVector3のZでカメラからの奥行きを指定すれば、想定どおりに動作するでしょう。

投稿2020/11/28 14:47

編集2020/11/28 14:49
Ram.Type-0

総合スコア424

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

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

MikanChan

2020/11/29 02:11 編集

ご回答ありがとうございます!すみません、Camera.ScreenToWorldPointに渡すVector3のZでカメラからの奥行きを指定するというのがよくわかっておりません。。もう少し詳細を教えていただくことはできますか。
Ram.Type-0

2020/11/29 14:58

Vector3 mousePos = Input.mousePosition; mousePos.z = 1; camera.ScreenToWorldPoint(mousePos); を試してみてください。
Ram.Type-0

2020/11/29 15:00

念の為補足しておくと、これはInput.mousePositionの使い方の問題ではなくCamera.ScreenToWorldPointの使い方の問題です。
MikanChan

2020/11/29 22:14

解決しました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問