70532
Unity2DでuGUI(Imageゲームオブジェクト)の幅(Width)をワールド座標で取得したくて本ソースコードを書きましたが、  
期待しない値が入っているため困っています。

期待した値：  
Canvas上のImageゲームオブジェクトの幅がワールド座標に変換された(0.9, 0.0, 0.0)くらいの値。

結果：Image のVector3(変数名：oneSquareForward)に(105.3, 0.0, 90.0)が入っていた。

私の行った手順は本ソースコードの通りです。

本ソースコード:

```

    ///<summary>
    ///プレーヤー1をスプライトの大きさぶん右へ表示
    ///用途：プレーヤーの指に隠れてキャラクターが見えなくなることを防ぐために使う
    ///</summary>
    public static Vector3 oneSquareForward = new Vector3(2.5f, 0.0f, 0.0f);
    
    /// <summary>
    /// 機能：oneSquareForwardにワールド座標でPlayerGameObject()の幅を設定する。
    /// 
    /// 引数：なし
    /// 
    /// 戻り値：なし
    /// 
    /// 備考：参考サイト：
    /// ①【Unity】GameObjectの幅と高さを取得・変更する方法（RectTransform）：https://techno-monkey.hateblo.jp/entry/2018/05/12/150845
    /// ②RectTransformからワールド座標に変換する方法：http://alien-program.hatenablog.com/entry/2017/08/06/164258
    /// </summary>
    private void Set_oneSquareForward()
    {
        // ワールド座標の幅を取得したいimageゲームオブジェクト(Player)を取得する
        GameObject player = GameObject.Find("Player");
    
        // PlayerのRectTransformを取得する
        RectTransform playerRectTransform = (RectTransform)player.transform;
    
        // Playerの幅(Width)を取得するローカル変数
        Vector3 playerWidth = Vector3.zero;
    
        // Playerの幅を取得する
        playerWidth = new Vector3(player.GetComponent<RectTransform>().sizeDelta.x, 0.0f, 0.0f);
    
        // UI座標からスクリーン座標に変換 
        Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.main, playerWidth);
    
        // ワールド座標を保持するローカル変数
        Vector3 result = Vector3.zero;
    
        // スクリーン座標→ワールド座標に変換
        RectTransformUtility.ScreenPointToWorldPointInRectangle(playerRectTransform, screenPos, Camera.main, out result);
    
        // oneSquareForwardに変換結果を入れる
        oneSquareForward = result;
    }
    
    // Set_oneSquareForwardの呼び出し元はAwake
    private void Awake()
    {
        Set_oneSquareForward();
    }
    
```

Unityのインスペクター上の設定：  
[![画像の説明をここに入力](https://i.stack.imgur.com/mH5Qr.png)](https://i.stack.imgur.com/mH5Qr.png)

[![画像の説明をここに入力](https://i.stack.imgur.com/7ovmO.png)](https://i.stack.imgur.com/7ovmO.png)

デバッグ中の変数の値：  
[![画像の説明をここに入力](https://i.stack.imgur.com/nBrzt.png)](https://i.stack.imgur.com/nBrzt.png)

私は、本ソースコードで、Imageゲームオブジェクトの幅をワールド座標に変換できると思いました。  
なぜなら、参考サイトには、以下のように書かれており、その通りにコーディングしたつもりだからです。  
1 RectTransformUtility.WorldToScreenPointで、UIの座標をスクリーン座標に変換する。  
2
1で取得したスクリーン座標を、RectTransformUtility.ScreenPointToWorldPointInRectangleを使ってワールド座標に変換(result)する。

ただ、直接sizeDeltaをワールド座標に変換する参考サイトではないので、私のソースコードのどこかが間違っているのかもしれませんが、どこが間違っているかわかりませんでした。

また、参考サイトを元にして書いた、UI座標からスクリーン座標に変換するコードですが、  
UI座標とは何かということが検索してもよくわかりませんでした。

他のサイトや英語のサイトも見てみましたが、参考にできそうなサイトがなく困っています。

どうすればUnity2DでuGUIのImageゲームオブジェクトの幅をワールド座標で取得できるのか教えて頂けるとありがたいです。  
どうかよろしくお願いいたします。
CC BY-SA 4.0
2020-09-13T06:44:40.510
70344
2020-09-19T03:11:36.250
2020-09-13T06:57:07.220
21034
21034
question
unity2d
Unity2DでuGUI(Imageゲームオブジェクト)の幅をワールド座標で取得したい
自己解決しました。  
解決した後のコードを投稿させて頂きます。

```

    // 呼び出し元：
    private void Awake()
    {
        Set_oneSquareForward();
    }
    
    // 呼び出し先：
    ///<summary>
    ///プレーヤー1をスプライトの大きさぶん右へ表示
    ///用途：プレーヤーの指に隠れてキャラクターが見えなくなることを防ぐために使う
    ///</summary>
    public static Vector3 oneSquareForward = new Vector3(2.5f, 0.0f, 0.0f);
    
    /// <summary>
    /// 機能：oneSquareForwardにワールド座標でPlayerGameObject()の幅を設定する。
    ///
    /// 引数：なし
    ///
    /// 戻り値：なし
    ///
    /// 備考：参考サイト：
    /// ①＜ワールド座標とローカル座標の変換＞：https://dkrevel.com/unity-explain/space/
    /// ②【Unity】GameObjectの幅と高さを取得・変更する方法（RectTransform）：https://techno-monkey.hateblo.jp/entry/2018/05/12/150845
    /// ③RectTransformからワールド座標に変換する方法：http://alien-program.hatenablog.com/entry/2017/08/06/164258
    /// </summary>
    private void Set_oneSquareForward()
    {
        // ワールド座標の幅を取得したいimageゲームオブジェクト(Player)を取得する
        GameObject player = GameObject.Find("Player");
    
        // PlayerのRectTransformを取得する
        RectTransform playerRectTransform = (RectTransform)player.transform;
    
        // Playerの幅(Width)を取得するローカル変数
        Vector3 playerWidth = Vector3.zero;
    
        // Playerの幅を取得する
        playerWidth = new Vector3(player.GetComponent<RectTransform>().sizeDelta.x, 0.0f, 0.0f);
    
        // 親のゲームオブジェクト(Canvas)
        GameObject canvas = GameObject.Find("Canvas");
    
        // ローカル座標からワールド座標に変換
        Vector3 world_playerWidth = canvas.transform.TransformPoint(playerWidth);
        // ↑の変換する際にCanvasのワールド座標のZ座標に変換しているので、z座標を他の処理の値と合わせるために0.0fを代入
        world_playerWidth = new Vector3(world_playerWidth.x, 0.0f, 0.0f);
    
        // oneSquareForwardに変換結果を入れる
        oneSquareForward = world_playerWidth;
    }
    
```
CC BY-SA 4.0
2020-09-19T03:11:36.250
70532
2020-09-19T03:11:36.250
21034
70344
answer