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

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

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

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

Q&A

解決済

2回答

1750閲覧

【Unity】buttonをクリックして表示するGameObjectの座標が想定した場所からズレる

Azm-yk

総合スコア10

Unity

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

0グッド

0クリップ

投稿2020/07/04 21:56

前提・実現したいこと

buttonを押すと、そのbuttonの上にGameObjectが表示されるようにしたいです。

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

buttonの中心にGameObjectを表示したいのですが、x軸とy軸が少しずれた位置に表示されます。
※Z軸に関してはこのままで問題ありません(GameObjectをbuttonより前面で表示したいため)

buttonの座標 :(x)-426, (y)−407, (z)0
GameObjectの座標:(x)-1.073298, (y)-0.4712038, (z)10

該当のソースコード

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class StumpGenerator : MonoBehaviour 7{ 8 public GameObject stumpPrefab; 9 public Vector3 buttonPos; 10 11 public void Stump() 12 { 13 buttonPos = this.transform.position; 14 buttonPos.z = 10f; 15 Instantiate(stumpPrefab, buttonPos,stumpPrefab.transform.rotation); 16 }

試したこと

buttonのanchorは中心になっています。

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

mac(ver.10.13.2) Unity2019.4.0f1 atom(テキストエディタ)

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

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

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

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

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

guest

回答2

0

ボタンは UI であり、通常はスクリーン上の座標を表しています。これは2次元です。GameObject はシーン内のワールド座標系を表しています。これは3次元ですが、2D であっても一緒です。

つまり UI(スクリーン)とゲームは通常は異なる空間に存在し、ゲームの画面(カメラで撮影したもの)の上に UI をオーバーレイ表示しています。別の言葉で言うと座標系が違います。

従って Transform の Position と RectTransform の Position を同じように扱うことはできません。座標変換する必要があります。

やり方についてはいろいろな方法があり、次の記事で説明されています。

Screenの座標とWorld(3D)座標の変換について

今回はどのような方法をとるのが良いかについては、質問に書かれている事を読む限りでは「UIの座標をWorld Spaceに変換する」がいいんじゃないかと思います。

ただ疑問なのは、どうやら 3D ゲームのようですが、UI には奥行がないのにゲーム上の奥行きはどう決定するのかという問題があります。もし Ray をヒットさせるような障害物がない場合は RectTransformUtility.ScreenPointToRay は使えず、RectTransformUtility.ScreenPointToWorldPointInRectangle を使う必要があります。

投稿2020/07/04 23:36

編集2020/07/04 23:38
bboydaisuke

総合スコア5275

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

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

bboydaisuke

2020/07/04 23:53

しかしさっき書いたやり方は若干ハードルが高いかもしれないし、さらに「オブジェクトをUIより前に表示する」という要件があるので、Canvas の Render Mode を World Space にしてゲームの中にUIを作ってしまってもいいかもしれません。 ただしこれだと、カメラがあちこち動く場合はどうするのかという問題があります。UI がゲーム空間の中にあるので、カメラが移動するとUIはゲーム空間のそこにとどまるため、カメラの動きに合わせてUIにも動いてもらう必要が出てくるかもしれません。
Azm-yk

2020/07/05 06:15

ご回答ありがとうございます! ButtonコンポーネントのOn click()項目のselect objectに、GameObjectではなく当該buttonを指定したところ、buttonの座標を中心にGameObjectが表示されるようになりました。 スクリプト中の「this」が「当該button」ではなく「Prefabのために適当に作成したGameObject」の座標を取得していたようです。 bboydaisuke様にご回答いただいた内容は、自分自身も理解があやふやなところでしたので、参考となるページも示していただきたいへん嬉しく思っております。今後ともよろしくお願いいたします。
Azm-yk

2020/07/05 06:25

また、作成しているのは2Dのもので、レイヤーに関してはCanvasのRender ModeをScreen Space - Cameraにし、Order In Layerを-1にしてGameObjectのOrder In Layerを0にしています。
guest

0

自己解決

ButtonコンポーネントのOn click()項目のselect objectに、GameObjectではなく当該buttonを指定したところ、buttonの座標を中心にGameObjectが表示されるようになりました。
スクリプト中の「this」が「当該button」ではなく「Prefabのために適当に作成したGameObject」の座標を取得していたようです。

投稿2020/07/05 06:15

Azm-yk

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問