【Unity】Rayってめっちゃ便利なんよ…簡単なミニゲーム風シューティングゲーム作ってみた


概要

こちらの記事ではRayCastについて紹介していきます。
こちらはとても便利な機能で、Rayを自由に操ることができればゲーム開発に幅が広がること間違いなしです!👍
今回はRayCastが具体的にどういうもので、どんなことができるのかを簡単に紹介できればと思ってますので、よかったら最後までお付き合いください。
サンプルコードをコピペすれば誰でも簡単に実装することができるので、初心者の方でも最悪理解しなくても使えるようにします!
できるだけ解説も入れていきますが、個人的な解釈が多いので参考程度にお願いします☺️

動作環境

MacOS : Catalina 10.15.7
Unity : 2019.4.16f1

RayCastとは

その名の通り、RayをCastするので「光を投げる」です。
光を投げるってよくわからない人は、簡単にいえば光を飛ばしていると思ってくれればOKです。
Rayを飛ばした時に、そのRayが何かに衝突した時に何かを処理するコードを書いたりいろいろできます。

チュートリアル

実際Unityにはネットにたくさんの記事が転がっていますので、Rayの使い方の紹介などはもう腐るほどあります。
こちらの記事が個人的にとても参考になるし、簡単で解説付きで分かりやすかったので
初めて使うよって人は、チュートリアルと称してまずそちらでいろいろ遊んでみてください!

Rayを飛ばして簡単なシューティングゲームを作ってみた

チュートリアルを終えた方は、早速ちょっと応用してみましょう!
CameraからRayを飛ばして画面に写っている敵をクリックして破壊するちょっとしたミニゲームを再現してみます!

以下のコードを書いてCameraにスクリプトをアタッチしてください!

RazerScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RazerScript : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RayCast();
        }
    }

    void RayCast()
    {
        //↓Rayの作成↓       
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        Debug.DrawRay(ray.origin, ray.direction * 10, Color.red, 5);

        if (Physics.Raycast(ray, out hit, 10.0f))
        {
            Destroy(hit.collider.gameObject);
        }
    }
}

コードの解説

Update()内からいきます。

RazerScript.cs

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RayCast();
        }
    }

if文の条件は「マウスの左クリックを押した瞬間」で、処理したい内容は
下の方に書いた「RayCast()を処理して!」→「光を飛ばして!」ってことになります。

続いてRayCast()の中身になります。

RazerScript.cs

    void RayCast()
    {
        //↓Rayの作成↓       
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

最初にRayを作成しています。

RazerScript.cs
        RaycastHit hit;

そのすぐ下で「RaycastHit」という型の「hit」という変数を宣言します。
これは衝突するオブジェクトの情報を入れるための箱になります。

        Debug.DrawRay(ray.origin, ray.direction * 10, Color.red, 5);

こちらがRayを可視化するための一文です。
Debug.Logに出だしが似てるのでなんとなく効果も同じ感じがしますね。
色も指定できるので、今回は赤色で試しています。自分の好きな色にしてみてください。
最後の「5」はRayの描写距離を設定しています。大きくすればより遠くまでRayを可視化することができます。

        if (Physics.Raycast(ray, out hit, 10.0f))
        {
            Destroy(hit.collider.gameObject);
        }
    }

そしてこれが、Rayが何かの対象に衝突した時、その対象物を破壊(Destroy)するコードになります。
Destroy()はゲーム開発においてかなり多用すると思うので、マスターしておくといいです。
上記でも記述したように、「hit」には衝突した対象物の情報が入っています。
「hit.collider.gameObject」とすることで対象物のGameObjectを指定することができます。

自由に実装して遊んでみよう!

敵の生成や落下する実装は今回は省きますが、ちょっと凝れば下のような簡単なシューティングゲームを作ることができます。
Rayは光線なので、一瞬で遠くまで届きますし、衝突をトリガーにいろんなことができるので、応用すれば幅広い用途で使用することができます。
(青いCubeが300点加点、赤いCubeが-100点されるシステムです。)

ただし、こんな便利なRayCastも実は重い処理になります。
ので、あまり多用しすぎると少々危険なので程々にしましょう笑

以上で終わります!ここまでお疲れ様でしたー!
またどこかで〜👋