ゲーム開発記 オノグラ編Part 2 “タッチでキャッチ”

ゲーム開発記 オノグラ編Part 2 “タッチでキャッチ”

こんにちは、
前回画面の仮置きをした ちきなるです

※オノグラは2Dゲームで、使用しているUnityは”Unity2018″です。

次にやるのは、スクリプトの作成です。

まずは、タッチした位置にあるオブジェクトを取得する処理を作ります。

とはいえ、Unityエディタでは、タッチのイベントが取得できないようなので、クリックで代用します。
※どっちみち私のモニタはタッチパネルではないので、クリックで代用するしかないです。

クリックされたかどうかを判断するのは

Input.GetMouseButtonDown(0)

上記の文では、左クリックされるとtrueを返します。

if(Input.GetMouseButtonDown(0)){ }

これで左クリックされた時、という条件文が記述できます。
※右クリックは、引数の0を1に変えると判定できます。2にするとミドルボタンになります。

これでクリックされた事がわかるので、次はクリックされた位置の取得をします。

クリックされた位置の取得は

Vector3 vec3;
vec3 = Input.mousePosition;

上記の分では、マウスがある位置を3次元座標として取得できます。

所得したマウスの位置でオブジェクトを取得したいところですが、このままでは問題があります。

それは、座標の取り方の問題です。Unityでは、いくつかの座標の取り方があり、Input.mousePositionで取得できる座標は、ピクセル座標といわれる座標です。
対してオブジェクトが持っている座標は、ワールド座標といわれる座標です。

ピクセル座標は、画面の左下を(0,0)とし、右上が(画面の幅,画面の高さ)となる座標です。

ワールド座標は、シーンの中心を(0,0)とする座標です。
※初期設定では、メインカメラの中央がシーンの中央になっています。

座標の取り方が異なるので、そのままマウスの位置でオブジェクトを取得しようとすると、変なところのオブジェクトを取得しようとします。
※ちなみに私は、そのまま取得しようとして何も取得されず、結構悩みました。

解決策は、ピクセル座標をワールド座標に変換して、ワールド座標でオブジェクトの確認に行けば解決です。

Vector3 vec3;
Vector3 vec3World;
vec3 = Input.mousePosition;;
vec3.z = 10.0f;
vec3World = Camera.main.ScreenToWorldPoint(vec3);

これでマウスの位置をワールド座標で取得できます。
※vec3のz座標に値を入れているのは、ピクセル座標は(x,y)なので、そのままワールド座標に変換すると、おかしな値になる場合があるので、z座標に10.0fを入れています。
※ワールド座標に変換するのは、”Camera“です頭文字が小文字の”camera“と間違えないように気を付けましょう。私は小文字の”camera”で変換しようとしていたので、ずっとエラーが出ていました。

後は、取得したワールド座標にオブジェクトがあるかチェックを行うと、クリックした位置にあるオブジェクトが取得できます。

Collider2D col;
col = Physics2D.OverlapPoint((Vector2)vec3World);

上記の文は、2次元座標でCollider2Dが設定されているオブジェクトを取得するメソッドです。正確にいうと指定した座標で、衝突を確認するメソッドで、衝突が発生した場合、衝突したCollider2Dを返します。
※オブジェクトにCollider2Dを設定していない場合、取得できないので注意が必要です。

if(Input.GetMouseButtonDown(0))
{
Vector3 vec3;
Vector3 vec3World;
Collider2D col;      vec3 = Input.mousePosition;
vec3.z = 10.0f;
vec3World = Camera.main.ScreenToWorldPoint(vec3);
col = Physics2D.OverlapPoint((Vector2)vec3World);
}

これでクリックした位置のオブジェクトが取得できます。

 

ゲーム開発記 オノグラ編Part 1 “画面とにらめっこ”

ゲーム開発記 オノグラ編Part 3 “動いて動くと動くんです”

 

Unityのスクリプトリファレンス

Input

Input.GetMouseButtonDown

Input.mousePosition

Physics2D.OverlapPoint