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