UnityでRaycastを利用して当たり判定を取るときの注意
Phisics.Raycastで当たり判定を取るときに、LayerMaskを使ってハマったのでそのメモ書き。
床との当たり判定やタップした場所を3次元上で知りたいときなどに有効なRaycastですが、引数の使い方を間違えるとうまく動作しないことがあります。
基本の使い方は
1 2 3 |
RaycastHit hit; float fDistance = 100.0f; bool bIsHit = Physics.Raycast( ray , out hit , fDistance); |
こんな感じです。はじめは距離(fDistance)を長めに設定しておいてあたったのを確認するとよろしいかも。
私の場合は3D平面上でタップした床の位置に移動する、みたいなことがしたかったのでLayerMaskの機能を追加で使っています。
サンプルソースはこんなかんじです↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// マウスのクリックがされたかどうか if(Input.GetMouseButtonDown(0)){ RaycastHit hit; // 床との当たり判定のみを取りたいのでマスクするレイヤーを設定する int layerNo = LayerMask.NameToLayer ("Floor"); int layerMask = 1 << layerNo; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); float fDistance = 100.0f; //レイを投射してオブジェクトを検出 if(Physics.Raycast( ray , out hit , fDistance , layerMask)){ print(hit.collider.gameObject.name); Debug.Log ( hit.collider.gameObject.name +":"+ hit.point); // ここでゲーム独自の処理 // 私の場合はフィールドタイプのプレイヤーを指定の位置まで移動させる m_csPlayerField.Move (hit.point); } } |
マスクするレイヤーはビット処理で増やしたりできるので必要に応じて増やしたり見てためしてください。
(というかマスクのビットが立ってると、逆に無視されるんじゃないかと思って使ってみるまで勘違いしてました。
一度使ってご自身の環境で試してみると理解が深まると思いますのでいろいろやってみてください)