【Unity】画面をタップした位置から特定のオブジェクトを取得する。

イベントトリガーを使って、透明オブジェクトを押せばと思ったのですが
失敗しました。

色々調べたけど、私の行き着いた方法を書いておきます。

バージョン

2021.3.3f1

条件および背景

まずは画像を。

ヒエラルキーはこれ。

大きい四角がAttackCheckArea
小さい四角がAttackArea

カニが上下に動き、それに追従して大小の四角も動くものとします。
よって、四角の座標も変化します。

条件

2Dゲームを作っています。

画像右側からオブジェクトが飛んできます。
それが小さな四角に入ったときに、大きな四角をタップしたら、オブジェクトを破壊する。

といった仕様です。

背景

イベントトリガーやPhysics.Raycastを試みましたが
Canvasがあるので、うまく機能せず。
(CanvasをOFFにすると、上のは機能しました。)

方法

  1. タップした場所(Vector3)を取得。
  2. 大きい四角のpositionを取得。
  3. それをワールド座標に変換。
  4. タップした場所が変換したワールド座標範囲内であるかをチェック

といった方法です。

具体的コード

       Ray ray = camera.ScreenPointToRay(Input.mousePosition);

②、③

Vector3 checkAttackAreaPos = checkAttackArea.transform.position;//Local
Vector3 checkAttackAreaWorldPos = checkAttackArea.transform.TransformPoint(checkAttackAreaPos);//Local to World

Vector2 checkAttackAreaSize = checkAttackArea.GetComponent<BoxCollider2D>().size;

float checkAreaX_Min = checkAttackAreaWorldPos.x - checkAttackAreaSize.x / 2f;
float checkAreaX_Max = checkAttackAreaWorldPos.x + checkAttackAreaSize.x / 2f;
float checkAreaY_Min = checkAttackAreaWorldPos.y - checkAttackAreaSize.y / 2f;
float checkAreaY_Max = checkAttackAreaWorldPos.y + checkAttackAreaSize.y / 2f;

if (checkAreaX_Min <= ray.origin.x && ray.origin.x <= checkAreaX_Max && checkAreaY_Min <= ray.origin.y && ray.origin.y <= checkAreaY_Max)

④のところでColliderのサイズを取得し、四隅を計算
最後のif文でrayが範囲内かどうかチェックしています。

ray.originはrayの発射始点で、Vector3型なので、x,yの取得が可能です。

今思えば、rayじゃなくてもできるかもしれませんが、紆余曲折の結果でうまく動いたのでそのまま使用してます。(笑)

参考サイト

Patio様
Unityでタップした位置のワールド座標を取得

タク様
Unityで画面をタップした位置のオブジェクトの情報が知りたい

Unity公式

UnityEngine.RaycastHit - Unity スクリプトリファレンス
レイキャストによる情報を得るための構造体
Physics-Raycast - Unity スクリプトリファレンス
シーンにあるすべてのコライダーに対して、originの位置からdirectionの方向にmaxDistanceの距離だけレイを投じます。
UnityEngine.Ray - Unity スクリプトリファレンス
レイ(光線)の表現

コメント

タイトルとURLをコピーしました