【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.widthとScreen.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;
}
}
最後に
いかがでしたでしょうか。
今回はスクリーン座標とワールド座標の変換方法について紹介しました。
以下の記事でも、座標変換を駆使して[ゲームオブジェクトをドラッグ操作する方法]を紹介しています。
まだピンとこない方は、是非参考にして頂けたらと思います。
以上、だらはでした。
ディスカッション
コメント一覧
まだ、コメントがありません