13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2018-11-24

  
  
  
この記事は

『プログラミング完全未経験から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;

= ~を使うことで逆になります。
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をデバッグ時に表示。コピペするだけ。

13
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?