【Unity】スクリーン座標とワールド座標の変換方法。ScreenToWorldPointを使います。

どうも、だらはです。
今回はスクリーン座標とワールド座標を変換する方法を紹介します。
具体的には以下を紹介します。

  • Screen.width
  • Screen.height
  • Camera.main.WorldToScreenPoint
  • Camera.main.ScreenToWorldPoint

スポンサーリンク

スクリーン座標とワールド座標を変換する方法

スクリーン座標とワールド座標を変換するには以下のメソッドを使います。

  • Camera.main.WorldToScreenPoint:ワールド座標をスクリーン座標に変換。
  • Camera.main.ScreenToWorldPoint:スクリーン座標をワールド座標に変換。

以下にサンプルスクリプトを書きます。

◆ScreenSc.cs

using UnityEngine;

public class ScreenSc : MonoBehaviour
{
    private Vector3 screenXYZ;
    private Vector3 screenObj;

    void Start()
    {
        //スクリーンの縦横サイズ
        Debug.Log("ScreenWidth:" + Screen.width + "," + "ScreenHeight:" + Screen.height);

        //Cubeのスクリーン座標
        screenObj = Camera.main.WorldToScreenPoint(transform.position);
        Debug.Log("Cube Screen" + screenObj);

        //スクリーン座標をワールド座標に変換
        screenXYZ = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));
        Debug.Log("Screen to WorldPoint" + screenXYZ);

        //Cubeのワールド座標
        Debug.Log("Cube World" + transform.position);
    }
}

◆実行結果

Screen.widthScreen.heightにて、スクリーンサイズを取得することができます。
スクリーンの原点は左下を原点とします。
つまり、今回の例では右上のXY座標が(800,533)となります。

また、今回の例ではスクリーン座標のMAX値(800,533)をワールド座標に変換すると、
ワールドXY座標(7.5, 6.0)となりました。

補足

補足ですが、カメラの設定にProjectionがあります。
Perspectiveに設定するとゲームオブジェクトが3Dのように見えます。
Orthographicに設定するとゲームオブジェクトが2Dのように見えます。

◆Projection:Perspective(3D)

◆Projection:Orthographic(2D)

サンプルとして、この設定をOrthographicにしたときに動作するスクリプトを記載します。
ゲームオブジェクトがスクリーンを左右に横断するスクリプトです。
2Dゲームで使えると思うので、参考までに。。

◆ObjCurve.cs

using UnityEngine;

public class ObjCurve : MonoBehaviour
{
    private Vector3 screenXYZ;

    public int moveType = 2;
    private float dx;
    private float dy;
    private float spdX = 1f;
    private float spdY = -1f;
    public float spdGainX = 1; //X軸調整用ゲイン
    public float spdGainY = 1; //Y軸調整用ゲイン
    private int direction = 1; //X軸進行方向
    private float posX;

    void Start()
    {
        //Enemyの進行方向初期化
        int tmpRandom = Random.Range(0, 100);
        if ((tmpRandom % 2) == 0)
        {
            direction = -1;
        }

        //EnemyのX軸の初速度初期化
        spdX *= Random.Range(1f, 3f);

        //スクリーンサイズ取得
        screenXYZ = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));
    }
    void Update()
    {
        //行動パタン選択
        switch (moveType)
        {
            case 2:
                Curve();
                break;
        }
        transform.position = new Vector3(dx, dy, 0);
    }

    void Curve()
    {
        dx = spdX * spdGainX * Time.deltaTime;
        dy = spdY * spdGainY * Time.deltaTime;

        posX = transform.position.x; //X軸位置

        float scr5p = screenXYZ[0] * (1f) * (0.5f);
        float scr3p = screenXYZ[0] * (1f) * (0.3f);
        float scr1p = screenXYZ[0] * (1f) * (0.1f);

        if (posX < -scr5p)
        {
            direction = 1;
            dx = dx * (1f - ((Mathf.Abs(posX) - scr1p) / (screenXYZ[0] - scr1p))) * direction;
        }
        else if (((-scr5p < posX) && (posX < -scr3p)) || ((scr3p < posX) && (posX < scr5p)))
        {
            dx = dx * (1f - ((Mathf.Abs(posX) - scr1p) / (screenXYZ[0] - scr1p))) * direction;
        }
        else if (((0f < posX) && (posX < scr3p)) || ((-scr3p < posX) && (posX < 0f)))
        {
            dx = dx * direction;
        }
        else if (scr5p < posX)
        {
            direction = -1;
            dx = dx * (1f - ((Mathf.Abs(posX) - scr1p) / (screenXYZ[0] - scr1p))) * direction;
        }

        dx += transform.position.x;
        dy += transform.position.y;

    }

}

最後に

いかがでしたでしょうか。
今回はスクリーン座標とワールド座標の変換方法について紹介しました。
以下の記事でも、座標変換を駆使して[ゲームオブジェクトをドラッグ操作する方法]を紹介しています。
まだピンとこない方は、是非参考にして頂けたらと思います。

以上、だらはでした。

スポンサーリンク

応用

Posted by daraha_gm