unityでオブジェクトのクリックを検知し、何かしらの処理を行うために、対象のオブジェクトに自分で追加したレイヤーの「HitLayer」を設定し、以下のような処理を記述しスクリプトをアタッチしました。
動作確認ということで、updateの度にlayerを指定している、など無駄な処理が多いことはスルーしてください。
C#
1 void Update () { 2 if (Input.GetMouseButtonDown(0)) { 3 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 4 RaycastHit hit = new RaycastHit(); 5 //ヒットするレイヤーを指定 6 int layer_no = LayerMask.NameToLayer ("HitLayer"); 7 int layer_mask = 1 << layer_no; 8 Debug.Log("CheckLayer:" + layer_no); 9 10 if (Physics.Raycast(ray, out hit,layer_mask)) { 11 Debug.Log("HitLayer:" + hit.collider.gameObject.layer); 12 if (gameObject.GetInstanceID() == hit.collider.gameObject.GetInstanceID()) { 13 //クリックされたので何かしらの処理 14 } 15 } 16 } 17 }
上記の処理で問題なく動作していたのですが、この検知したいオブジェクトとカメラの間に、レイヤーが「HitLayer」でないColliderを持るオブジェクトがあると、Physics.Raycastで、そのオブジェクトがヒットしてしまいます。
Physics.Raycastでレイヤーマスクの指定をしていないならば、よりカメラに近い、別なオブジェクトがヒットすることも理解できますが、わざわざレイヤーマスクの指定をしているにも関わらず、そのそのレイヤーを持たない別なオブジェトがヒットする理由がわかりません。
この問題が起きているとき、上記コードのDebug.Logの「CheckLayer」と、「HitLayer」では別な数字が返ってきますので、うっかり、同じレイヤーを設定している、ということはないははずです。
また、layer_maskの指定方法が間違っているかと思い、「layer_mask」の部分の処理を以下のように変更しましたが、結果は変わりませんでした。
C#
1string LayerName = "HitLayer"; 2int layer_mask = LayerMask.GetMask(new string[] {LayerName});
参考:https://indie-du.com/entry/2015/02/09/200000
というわけで、原因を追究しても解決方法がわかりません。何かアドバイスを頂ければと思います。????????
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/06 10:42