イベントトリガーを使って、透明オブジェクトを押せばと思ったのですが
失敗しました。
色々調べたけど、私の行き着いた方法を書いておきます。
バージョン
2021.3.3f1
条件および背景
まずは画像を。

ヒエラルキーはこれ。

大きい四角がAttackCheckArea
小さい四角がAttackArea
カニが上下に動き、それに追従して大小の四角も動くものとします。
よって、四角の座標も変化します。
条件
2Dゲームを作っています。
画像右側からオブジェクトが飛んできます。
それが小さな四角に入ったときに、大きな四角をタップしたら、オブジェクトを破壊する。
といった仕様です。
背景
イベントトリガーやPhysics.Raycastを試みましたが
Canvasがあるので、うまく機能せず。
(CanvasをOFFにすると、上のは機能しました。)
方法
- タップした場所(Vector3)を取得。
- 大きい四角のpositionを取得。
- それをワールド座標に変換。
- タップした場所が変換したワールド座標範囲内であるかをチェック
といった方法です。
具体的コード
①
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 スクリプトリファレンス
レイ(光線)の表現
コメント