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

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

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

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

Unity3D

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

Q&A

解決済

2回答

5431閲覧

​ uGUIからRayを飛ばす

Qoo

総合スコア1249

C#

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

Unity3D

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

0グッド

2クリップ

投稿2016/10/24 07:58


マウス(タッチ)でオブジェクトを取得するにあたって

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

とすると、マウスカーソルの位置からカメラに表示された画面の奥方向へのRayを飛ばせると思うのですが、
同じように、uGUI(Image)の位置からカメラに表示された画面の奥方向へのRayを飛ばそうと思い

Ray ray = Camera.main.ScreenPointToRay(_image.transform.localPosition);

としたのですが、uGUIの下(would)にある3Dオブジェクトが取得できません
uGUIの座標自体はスクリーン座標だと思っていたのですが、
uGUIの位置からカメラに表示された画面の奥方向へのRayを飛ばし、
オブジェクトを取得するにはどうすればよいでしょうか

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

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

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

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

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

guest

回答2

0

自己解決

解決しました。
以下のサイトに情報がありました。
StackOverFlow

c#

1public Canvas canvas; 2public RectTransform _imageRect; 3 4void Update () { 5 6 Ray ray = Camera.main.ScreenPointToRay( GetUIScreenPos(_imageRect) ); 7 Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow); 8 9 RaycastHit hit = new RaycastHit(); 10 if (Physics.Raycast (ray, out hit)) { 11 Debug.Log (hit.collider.gameObject.name); 12 } 13 14} 15 16//UIの座標をスクリーン座標に変換する関数 17Vector2 GetUIScreenPos (RectTransform rt) { 18 19 //UIのCanvasに使用されるカメラは Hierarchy 上には表示されないので、 20 //変換したいUIが所属しているcanvasを映しているカメラを取得し、 WorldToScreenPoint() で座標変換する 21 return RectTransformUtility.WorldToScreenPoint(canvas.worldCamera,rt.position); 22 23} 24

投稿2016/10/24 13:13

Qoo

総合スコア1249

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

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

0

UnityのCameraが使う3つの座標系

Input.mousePositionで取得できるのはスクリーン座標です。
だから ScreenPointToRayがそのまま使えます。
_image.transform.localPositionで取得できるのはローカル座標です。
ローカル座標をそのままレイにする関数はたしか無いです。
後、ローカル座標だと道のりが長くなるのでワールド座標の方を使うようにしてください。
結論としては以下のように書き直せば動くのではないかと

C#

1var screenPoint = Camera.main.WorldToScreenPoint(_image.transform.position); // ワールド座標からスクリーン座標へ 2Ray ray = Camera.main.ScreenPointToRay(screenPoint ); // スクリーン座標ならScreenPointToRayが使える

投稿2016/10/24 08:29

ishi9

総合スコア1294

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

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

Qoo

2016/10/24 10:01

回答ありがとうございます。 教授頂いた通りに試してみたのですが、やはり取得できないです。。 何が悪いのでしょう・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問