Help us understand the problem. What is going on with this article?

【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 = 8;

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

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

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

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をデバッグ時に表示。コピペするだけ。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away