Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@OKsaiyowa

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

More than 1 year has passed since last update.

  
  
  
この記事は

『プログラミング完全未経験から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をデバッグ時に表示。コピペするだけ。

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  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
OKsaiyowa
備忘録として学んだことを記録します。 あやふやな箇所が多いですが、そんなときはビシッと指摘いただけますと幸いです。
unity-game-dev-guild
趣味・仕事問わずUnityでゲームを作っている開発者のみで構成されるオンラインコミュニティです。Unityでゲームを開発・運用するにあたって必要なあらゆる知見を共有することを目的とします。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?