hildsoftのコード置き場

プログラム関連で調べたことやコードの保管場所です

Unityでクリックした位置にprefabを作成する(Orthographic編)

スポンサーリンク

Unityでクリックした位置にprefabを作成する(Orthographic編)

検証環境

Unity:5.6.1f1

カメラの設定

Unityのカメラ設定でProjectionという項目があります。

どのように空間を映すかという設定なのですが、

  • Orthographic
  • Perspective

の2パターンがあります。

この記事ではOrthographicの場合について説明します。

Perspectiveはこちら code.hildsoft.com

Orthographic

f:id:hildsoft:20170621203458p:plain

設定はカメラのProjectionで変更可能です。

OrthographicもPerspectiveも3次元を2次元に投影する方法ですが、
Orthographicではカメラに対して前後の概念はあっても「奥行き」というものがありません。

遠くにあっても、近くにあっても同じ大きさで表現されます。

f:id:hildsoft:20170621203824p:plain

Z正方向を見たカメラに2つのキューブを置きました。

シーンビューで斜め上からPerspectiveで見た図がこちらです。

片方のZ座標は-5で、もう片方は0です。


f:id:hildsoft:20170621204042p:plain

実際にカメラに映し出されるのがこの図になります。

奥にあるにもかかわらず、同じ大きさに見えます。これがOrthographicの特徴です。

2Dゲームなどではこの投影方式を選択することが多いですが、Perspectiveでも画角を調整することで奥行きの感じられない2D的なゲームを作成することも可能です。

クリックした座標のとり方

画面のクリック位置を取る方法はこちらの記事を参照してください。

code.hildsoft.com

prefabを作成

public GameObject prefab; // prefabはインスペクタから与えてください。

private Camera cam;

void Start ()
{
    this.cam = FindObjectOfType<Camera>();
}
    
void Update () {
    if(Input.GetMouseButtonUp(0))
    {
        var mousePosition = Input.mousePosition;
        mousePosition.z += 1f; // カメラのZ座標に+1
        // mousePosition.z -= this.cam.transform.position.z; // XY平面上に
        var worldPoint = this.cam.ScreenToWorldPoint(mousePosition);

        GameObject.Instantiate(this.prefab, worldPoint, Quaternion.identity);
    }
}

Input.mousePositionのZは常に0です。

Camera.ScreenToWorldPoint(Vector3 v)

で変換すると、カメラが見ている範囲のx,y座標に変換してくれますが、Zはカメラの座標からの相対値が返されます。

Zの値を変更しないとカメラと同じ位置にインスタンスを作成されて見えないので、少し前に移動させます。

Perspectiveでもそうですが、ScreenToWorldPointを使用しても座標が変わらない、オブジェクトが見えないなどはこの辺が原因であることが多いです。

この例では+1だけしていますが、他のオブジェクトとの前後関係を考慮した値を設定してください。

f:id:hildsoft:20170621211901p:plain

実行して適当にクリックしてみたのがこの図です。

カメラのすぐ前方に緑のキューブが作成されています。

奥行きについて

f:id:hildsoft:20170621211042p:plain

画面上は点でも、実際には奥行きがある事を理解しておいてください。

また、線上のどこにあるかは画面からは判断できません。

プログラム内でレイヤーに分けて管理するか、raycastなどで調べることになります。

補足

Orthographicを使う際は、Z軸に平行で、x,y平面を映すようにした方が良いです。

カメラに角度をつけてしまうと上記の方法ではズレが生じてしまいます。

もちろん補正してしまえば問題ないのですが、バグの原因にもなりかねませんので必要が無ければ避けた方が良いです。

2次元の被写体全部を傾けるよりは楽なので、その場合はカメラを傾けた方が楽になります。

参考サイト

tsubakit1.hateblo.jp

関連リンク

Unity - スクリプトリファレンス: Camera

Unity - スクリプトリファレンス: Camera.orthographic