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

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

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

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

解決済

1回答

589閲覧

Unityで画面上のUIの幅を取得したい(Cameraはorthographic)

namari82

総合スコア11

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2023/11/23 04:28

編集2023/11/23 05:42

実現したいこと

・画面上のUIの幅を取得したい

前提

Unityでマウスの座標、ゲームウィンドウのwidth、UIのwidthをそれぞれ取得して、マウスに追従するがウィンドウをはみ出さないUIを表示しようとしています。
CanvasはWorld Spaceを利用しています。
Canvasは下記です。

Canvasの設定

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

例えば、1920*1080のウィンドウの左の方にマウスを置いて、マウスに追従するUIを表示するとすると、
マウスのX座標(400ぐらい)Input.mousePosition
ウィンドウの幅(1920)UnityEngine.Screen.width
UIの幅(1000)UI.GetComponent<RectTransform>().rect.width
のようなものが取得できますが、この内「UIの幅」だけが不正な値を取得している気がしてなりません。
具体的に言うと、CameraのorthographicSizeを変えてもUI.GetComponent<RectTransform>().rect.widthは変わらない値が返ってきます。
あくまで「画面上」のUIの幅を知りたいので、orthographicSizeを小さくすれば、画面上のUIは大きくなって、取得したい数字は大きくなるはずです。
おそらくorthographicSizeを利用した係数をrect.widthに乗算するイメージはあるのですがうまい方法が思いつきません。

orthographicSize2のときの幅
orthographicSize3のときの幅
当然ながらorthographicSizeを変えると画面上のUIの大きさは変わりますが、こちらの幅を取得する方法が分からないという質問です。
rect.widthはorthographicSizeを変えても全く同じ「1000」のままです。

試したこと

ワールド座標に変換して取得してみたりしましたが、そもそも桁が全く合いません。
World SpaceのUIなので、ワールド座標とスクリーン座標が関わっている気もしているのですが…

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

Unity 2021.3.28f

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

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

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

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

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

fiveHundred

2023/11/23 04:47

World Spaceを使用している場合、その名の通りワールド座標上に配置されるので、少なくともデフォルトではorthographicSizeなどのカメラの設定は影響しないはずです。 デフォルト以外であれば私は試したことは無いので分かりませんが、他の人が分かるようにその設定を記載したほうがよろしいかと思います。
namari82

2023/11/23 05:43

設定を追加で記載しました。
fiveHundred

2023/11/23 05:50

> 当然ながらorthographicSizeを変えると画面上のUIの大きさは変わりますが 私の言っている通り、ワールド座標上での大きさなので、UIのオブジェクト自体の大きさを変えない限り、カメラの画角・大きさ・位置をいくら変えようが、UIのオブジェクト自体の大きさはそのままなので、値は変わりません(orthographicSizeでも同じでしょう)。
namari82

2023/11/23 06:39

そうですね。ありがとうございます。カメラを変えても、UIの値は変わらないですが、実際の画面上に表示される大きさは変わってしまうので、この実際に変わってしまった画面上の幅を取得したいという質問です。
guest

回答1

0

ベストアンサー

コードを書いてみました。
static関数なので、CalcSize.Width(対象のRectTransform, 対象のカメラ);とすれば呼び出せます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public static class CalcSize 6{ 7 public static float Width(RectTransform rectTransform, Camera eventCamera) 8 { 9 Vector3[] worldVec = new Vector3[4]; 10 rectTransform.GetWorldCorners(worldVec); 11 12 Vector3 bottomLeftWorld = worldVec[0]; 13 Vector3 bottomLeftScreen = eventCamera.WorldToScreenPoint(bottomLeftWorld); 14 Vector2 bottomLeftScreenVec2 = new Vector2(bottomLeftScreen.x, bottomLeftScreen.y); 15 16 Vector3 bottomRightWorld = worldVec[3]; 17 Vector3 bottomRightScreen = eventCamera.WorldToScreenPoint(bottomRightWorld); 18 Vector2 bottomRightScreenVec2 = new Vector2(bottomRightScreen.x, bottomRightScreen.y); 19 20 return Vector2.Distance(bottomLeftScreenVec2, bottomRightScreenVec2); 21 } 22 23 public static float Height(RectTransform rectTransform, Camera eventCamera) 24 { 25 Vector3[] worldVec = new Vector3[4]; 26 rectTransform.GetWorldCorners(worldVec); 27 28 Vector3 bottomLeftWorld = worldVec[0]; 29 Vector3 bottomLeftScreen = eventCamera.WorldToScreenPoint(bottomLeftWorld); 30 Vector2 bottomLeftScreenVec2 = new Vector2(bottomLeftScreen.x, bottomLeftScreen.y); 31 32 Vector3 topLeftWorld = worldVec[1]; 33 Vector3 topLeftScreen = eventCamera.WorldToScreenPoint(topLeftWorld); 34 Vector2 topLeftScreenVec2 = new Vector2(topLeftScreen.x, topLeftScreen.y); 35 36 return Vector2.Distance(bottomLeftScreenVec2, topLeftScreenVec2); 37 } 38}

投稿2023/11/23 06:41

fiveHundred

総合スコア10336

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

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

namari82

2023/11/23 07:56

なるほど!GetWorldCornersで4隅のワールド座標取ってローカル座標に変換すればよかったんですね!!! 非常に助かりました。ワールド座標とローカル座標がこんがらがってたみたいです。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問