Roba Memo - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

Raycastによるマウス座標との当たり判定

はまったのでメモ。

レイキャストについて

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) {
            //処理;
        }
    }   
}

以上。