チャックブログ

UnityやC#などをメインに公開していきます。C++も勉強始めました!

【Unity】3D座標を2D座標に直す方法

*3D座標を2D座標に変換 オブジェクトのxとyの値だけを使えばそれは2Dの座標なのでは?と最初自分は思っていましたがCameraの位置や角度を変えるとうまくいかなくなるのでそれらに対応したものを作っていきましょう。

*Script公開

    public GameObject obj;          //3D座標から2D座標に変換したいオブジェクト
    public GameObject confirmation; //座標がちゃんと変換されているか確認用

    void Start()
    {
        //カメラを平行投影にする ここ一番重要!透視投影のままだとうまく座標変換できません
        Camera.main.orthographic = true;
    }

    // Update is called once per frame
    void Update()
    {
        confirmation.transform.position = Change2DPos(obj);
    }

    Vector2 Change2DPos(GameObject obj3D)
    {
        //Camera.mainになっていますが設定したいCameraがあれば変更してくさい。
        Vector2 pos2D=Camera.main.ViewportToWorldPoint(Camera.main.WorldToViewportPoint(obj3D.transform.position));
        return pos2D;
    }
}

Script的にはこうなります。

変換部分の解説

     //一度3Dのオブジェクト座標をビューポート座標に変換。
     var pos1= Camera.main.WorldToViewportPoint(obj3D.transform.position);
     //ここのZの値はカメラのZ座標が入るので一度0にします(ここはご自由に変えてください)
     pos1.z=0;
     //ビューポート変換した座標をワールド座標に直します。
     var pos2 =Camera.main.ViewportToWorldPoint(pos1);

これらのことを一行で書くと最初に書いたコードになります(Z座標とくに考慮してませんが)

*終わり なにか質問やここ間違ってるなどありましたらコメントください。