はまったのでメモ。
レイキャストについて
public static bool Raycast(Parameter);
下の公式リファレンスをみると、このParameterの設定方法は色々あるみたい。
目的に応じて使い分けるということかな。
docs.unity3d.com
マウス座標からRayを飛ばすには
Camera.main.ScreenPointToRay (Input.mousePosition);
これで、マウス座標からのRayが設定できるらしい。 方向は、おそらくカメラの向きになるかと。
名前でターゲットを探す方法
Physics.Raycast ()のパラメーター
説明は公式より引用
Ray ray
レイの始点と方向RaycastHit hit_info
もし true が返されると hitInfo にはコライダーのヒットに関する詳細情報が含まれるようになります。float max_distance
レイが衝突を検知する最大距離
サンプルコード
GameObject hit_target; void Update () { if (Input.GetMouseButtonDown (0)) { Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); RaycastHit hit_info = new RaycastHit (); float max_distance = 100f; bool is_hit = Physics.Raycast (ray, out hit_info, max_distance); if (is_hit) { if (hit_info.transform.name == hit_target.name) { //TODO: ヒットした時の処理; } } } }
レイヤーマスクで探す方法
Physics.Raycast ()のパラメーター
説明は公式より引用
Vector3 origin
ワールド座標でのレイの開始地点Vector3 direction
レイの方向float max_distance
レイが衝突を検知する最大距離layer_mask
レイヤーマスク はレイキャストするときに選択的に衝突を無視するために使用します。
レイヤーマスク
はまったのは、レイヤーマスク。
レイヤーを取得しただけじゃだめで、マスクをかけないといけないらしい。
int layer = LayerMask.NameToLayer ("レイヤー名"); int layer_mask = 1 << layer;
1 << layer
は、レイヤーが一番前に表示されるようにずらしている。という解釈でいいのかな?
<<
をシフト演算子というらしい。
サンプルコード
void Update () { if (Input.GetMouseButtonDown (0)) { Vector3 origin = Camera.main.ScreenToWorldPoint (Input.mousePosition); Vector3 direction = Vector3.forward; float max_distance = 100f; int layer = LayerMask.NameToLayer ("Drag"); int layer_mask = 1 << layer; bool is_hit = Physics.Raycast (origin, direction, max_distance, layer_mask); if (is_hit) { //処理; } } }
以上。