こんにちは、
前回画面の仮置きをした ちきなるです
※オノグラは2Dゲームで、使用しているUnityは”Unity2018″です。
次にやるのは、スクリプトの作成です。
まずは、タッチした位置にあるオブジェクトを取得する処理を作ります。
とはいえ、Unityエディタでは、タッチのイベントが取得できないようなので、クリックで代用します。
※どっちみち私のモニタはタッチパネルではないので、クリックで代用するしかないです。
クリックされたかどうかを判断するのは
上記の文では、左クリックされるとtrueを返します。
これで左クリックされた時、という条件文が記述できます。
※右クリックは、引数の0を1に変えると判定できます。2にするとミドルボタンになります。
これでクリックされた事がわかるので、次はクリックされた位置の取得をします。
クリックされた位置の取得は
vec3 = Input.mousePosition;
上記の分では、マウスがある位置を3次元座標として取得できます。
所得したマウスの位置でオブジェクトを取得したいところですが、このままでは問題があります。
それは、座標の取り方の問題です。Unityでは、いくつかの座標の取り方があり、Input.mousePositionで取得できる座標は、ピクセル座標といわれる座標です。
対してオブジェクトが持っている座標は、ワールド座標といわれる座標です。
ピクセル座標は、画面の左下を(0,0)とし、右上が(画面の幅,画面の高さ)となる座標です。
ワールド座標は、シーンの中心を(0,0)とする座標です。
※初期設定では、メインカメラの中央がシーンの中央になっています。
座標の取り方が異なるので、そのままマウスの位置でオブジェクトを取得しようとすると、変なところのオブジェクトを取得しようとします。
※ちなみに私は、そのまま取得しようとして何も取得されず、結構悩みました。
解決策は、ピクセル座標をワールド座標に変換して、ワールド座標でオブジェクトの確認に行けば解決です。
Vector3 vec3World;
vec3 = Input.mousePosition;;
vec3.z = 10.0f;
vec3World = Camera.main.ScreenToWorldPoint(vec3);
これでマウスの位置をワールド座標で取得できます。
※vec3のz座標に値を入れているのは、ピクセル座標は(x,y)なので、そのままワールド座標に変換すると、おかしな値になる場合があるので、z座標に10.0fを入れています。
※ワールド座標に変換するのは、”Camera“です頭文字が小文字の”camera“と間違えないように気を付けましょう。私は小文字の”camera”で変換しようとしていたので、ずっとエラーが出ていました。
後は、取得したワールド座標にオブジェクトがあるかチェックを行うと、クリックした位置にあるオブジェクトが取得できます。
col = Physics2D.OverlapPoint((Vector2)vec3World);
上記の文は、2次元座標でCollider2Dが設定されているオブジェクトを取得するメソッドです。正確にいうと指定した座標で、衝突を確認するメソッドで、衝突が発生した場合、衝突したCollider2Dを返します。
※オブジェクトにCollider2Dを設定していない場合、取得できないので注意が必要です。
{
Vector3 vec3;
Vector3 vec3World;
Collider2D col; vec3 = Input.mousePosition;
vec3.z = 10.0f;
vec3World = Camera.main.ScreenToWorldPoint(vec3);
col = Physics2D.OverlapPoint((Vector2)vec3World);
}
これでクリックした位置のオブジェクトが取得できます。
ゲーム開発記 オノグラ編Part 3 “動いて動くと動くんです”
Unityのスクリプトリファレンス
コメント