libro
www.tuyano.com
C#ではじめるUnityプログラミング入門

マウス操作とスクリーン座標 (3/4)

作成:2014-09-15 09:52
更新:2014-09-15 09:52

■スクリーン座標をワールド座標に変換する

mousePositionで得られたマウスポインタの位置をシーン内で利用するためには、スクリーン座標として取り出した位置を、シーン内の3次元空間の位置に変換しなければいけません。

シーン内の3次元空間は「ワールド座標」と呼ばれます。表示されているシーンは、「どこから見たものなのか」によって表示される場所が違います。ですから、スクリーン座標をワールド座標に変換するためには、「どのカメラから見たシーンなのか」を考えて処理しないといけません。

カメラは、Cameraというクラスとして用意されています。Main Cameraは、Camera内の「main」というプロパティにインスタンスが用意されています。この中の「ScreenToWordlPoint」というメソッドを使うことで、そのカメラから見た3次元空間内のワールド座標に変換することができます。
Vector3 変数 = Camera.main.ScreenToWorldPoint( 変換するVector3 );

mousePositionから得られたVector3を引数にして呼び出すと、Main Cameraから見たワールド座標に変換されます。このとき重要になるのが、スクリーン座標のVector3の「z」値です。

mousePositionの値は、スクリーン座標ですからxとyの値しか設定されていません。zは、ワールド座標に変換した時の「カメラからの距離」として使われます。3次元空間は奥行きがありますから、2次元の座標から変換する際には「どれぐらい離れているか」という第3の値が必要なのです。

下に、利用例を挙げておきましょう。シーン内をクリックすると、その地点にCubeが移動します。Input.mousePositionの値を取得し、zの値を適当に設定してからScreenToWorldPointで座標変換する。そして得られたVector3にCubeのpositionを変更すれば、「クリック地点に移動」が実現できます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

    void Update () {
        transform.Rotate(1,1,1);
        if (Input.GetMouseButtonDown(0)){
            Vector3 pos = Input.mousePosition;
            pos.z = 5; // カメラからの距離
            Vector3 pos2 = Camera.main.ScreenToWorldPoint(pos);
            Debug.Log(pos);
            transform.position = pos2;
        }
    }

※関連コンテンツ

「C#ではじめるUnityプログラミング入門」に戻る