Ray(光線)をオブジェクトに照射し、その当たり判定で、いろいろな制御が可能です。
たいへん便利なRayCastの機能ですが、どんなオブジェクトでも当たってしまうと、かえって都合が悪い場合もあります。
オブジェクトによってはRayを当てないように、設定してみましょう。
関連記事:
クリックした位置にオブジェクトを生成(Ray)
Rayが当たった位置までの距離
Rayに当たったオブジェクトを削除
Rayの当たった場所にオブジェクトを移動
Cube、シリンダー、平面を作成しました。
次に、Rayの当たった場所に置くオブジェクトを作成します。
Sphereを作成してサイズを変更し、赤色をつけました。
SphereMove.csを作成し、Sphereに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereMove : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0)) { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { transform.position = new Vector3 (hit.point.x, hit.point.y, hit.point.z); } } } } |
これで、すべてのオブジェクトに対して、Sphereを置くことができます。
オブジェクトごとに設定する場合
オブジェクトごとに、Rayを当てない簡単な設定を行います。
今回は、Cubeを当てないようにします。
Cubeのレイヤーを、Ignore Raycastに変更しましょう。
プレイして確認します。
Cubeだけは、クリックしてもRayCastがぶつからず、Sphereを置くことができません。
スクリプトで制御する
続いて、レイヤーごとにRayの衝突を有効にするスクリプトを作ってみましょう。
レイヤーの8番に、RaycastHitという名前のレイヤーを作成しました。
今回は、CubeとPlaneに対してだけ、Rayを有効にします。
それぞれRaycastHitのレイヤーを設定しましょう。
SphereMove.csを開き、もう一度編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SphereMove : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0)) { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); int layerMask = 1 << 8; if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask)) { transform.position = new Vector3 (hit.point.x, hit.point.y, hit.point.z); } } } } |
プレイしてみましょう。
CubeとPlaneには、Rayが有効ですが、シリンダーには無効になります。
関連記事:
クリックした位置にオブジェクトを生成(Ray)
Rayが当たった位置までの距離
Rayに当たったオブジェクトを削除