【Unity(C#)】Rayの判定(Tag、Layerを使って衝突させたいオブジェクトの選定)


  
  
  
この記事は

『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』

の記事です。そのつもりでお読みください。

##Rayってなんやねん
まずRayってなんやねんって思ったので調べて使ってみました。
  
指定した方向とか指定したゲームオブジェクトからレーザー光線をだせる機能っぽいです。
だからといって敵を倒したりunityの必殺技だったりするわけでは無いっぽいです。

なぜなら、Rayは基本的に目視できませんでした。

デバック時にシーン上に表示することはできるようですが、ゲーム画面には出てきません。
ゲーム画面に光線を出すには別のコンポーネントでレンダリングした光線っぽいやつを作らないと
(私がアホなだけで方法はあるのかもしれませんが)できませんでした。

##Rayを出して衝突を判定する
どうやらRayというレーザー光線は衝突判定を行えるようで、とても便利でした。

Physics.Raycast(①Ray ray, ②out RaycasatHit hitInfo, ③float maxDistance, ④int layerMask)

②のout修飾子は正直あんまわかんないです。

参考サイト
↑これを見て、out修飾子を使う理由は
"レイが「何か」に当たる度に変数を「何か」に書き換えることができますよ"
であると勝手に解釈しました。

 Ray ray = new Ray(transform.position, transform.forward);

 RaycastHit hit; //レイが衝突したオブジェクト

       
 if (Physics.Raycast(ray, out hit, Mathf.Infinity))

  {
   //もしrayとhitが衝突した場合...の処理内容
  }

###Tagと一致しているか判定してさらに分岐させる

Inspector画面でTagをつけてきましょう。
あと、このやり方だとTagのついたオブジェクトにはコライダーが必要です。

if (hit.collider.CompareTag("Block"))
 {
    //もしhitのタグが"Block"と一致していた場合...の処理内容
 }

あとはマウスからレイを出して...とか敵の目線からレイを出して...とかを
適当に書き加えて使ってください。


2019/5/31 追記

Physics.Raycast(Ray ray, out RaycasatHit hitInfo, float maxDistance, int layerMask)
について、4つ目の引数であるlayerMaskについて理解が乏しかったので追記します。

###LayerMask
衝突させたいオブジェクト、させたくないオブジェクトをlayerで判定します。
デフォルトでは0になっているので何も書かないとlayerがDefaultのオブジェクトにのみ衝突します。

例えば1~7番までのLayerを無視したい場合は
このように宣言してから引数としてlayerMaskを渡せば1~7を無視することができます。

int layerMask = 1 << 8;

↓これと同じですね。

int layerMask = 256;

↓逆に8だけ無視したい場合はこうです。

int layerMask = 1 << 8;
layerMask = ~layerMask;

= ~を使うことで逆になります。

###LayerMask.NameToLayer
名前で直接指定して判定できる分、こちらの方が使い勝手がいいような気もします。

if (hit.collider.gameObject.layer == LayerMask.NameToLayer("レイヤーの名前"))
 {
    //もしhitのレイヤーが指定した"レイヤーの名前"と一致していた場合...の処理内容
 }

2019/3/30 追記

 Debug.DrawRay(ray.origin, ray.direction*100, Color.red,  0.1f);

Rayをデバッグ時に表示。コピペするだけ。