タッチしたSpriteを取得するには当たり判定用のコライダーを追加する必要があります。 タッチした座標はInput.mousePositionで取得できますが、この座標はスクリーン座標になっていて、 そのままでは使えないのでScreenToWorldPointを使ってワールド座標に変換して使います。
if( Input.GetMouseButtonDown(0) ) { Vector2 point = Camera.main.ScreenToWorldPoint( Input.mousePosition ); Collider2D collition2d = Physics2D.OverlapPoint( point ); if( collition2d ) { Debug.Log( collition2d.gameObject.name.ToString() ); } }
これを適当なGameObject(MainCameraなど)にアタッチするとタッチしたGameObjectの名前のログが出力されます。
ゲームオブジェクトが重なると上手く判定出来ないことがあります。
例えばこんな風にSpriteが重なっていて、どちらにもコライダーが追加されている時、 緑のスプライトを取得しようとしても、オレンジのスプライトを取得してしまう場合があります。 これを回避するには、Spriteのレイヤーを分ける必要があります。
SpriteのInspector項目にLayerがあります。 これが初期値ではDefaultになっているので緑のSpriteをUIに変更します。
実はPhysics2D.OverlapPointにはMaskLayerを指定することが可能です。 指定すると特定のレイヤーのみを判定できたりします。先ほどUIに変更したレイヤーのみ判定してみます。
if( Input.GetMouseButtonDown(0) ) { int enablelayer = 1 << LayerMask.NameToLayer("UI"); Vector2 point = Camera.main.ScreenToWorldPoint( Input.mousePosition ); Collider2D collition2d = Physics2D.OverlapPoint( point, enablelayer ); if( collition2d ) { Debug.Log( collition2d.gameObject.name.ToString() ); } }
LayerMask.NameToLayer() で取得したレイヤー番号はビットで判定するのがルールなので、1 « でシフトしています。
int disablelayer = ~(1 << LayerMask.NameToLayer("UI"));
〜チルダでNOT(否定)していることに注目。
Vector3 point = Input.mousePosition; int enablelayer = 1 << LayerMask.NameToLayer("UI"); float minDepth = point.z + 1.0f; Collider2D collition2d = Physics2D.OverlapPoint(new Vector2(point.x, point.y), enablelayer, minDepth );
minDepth,maxDepthパラメータでZ軸にもとづいてオブジェクトをフィルタリングすることができる。