UnityUnityメモ

Unity初心者向け!プレイヤーの正面にRaycastを出してヒットを確認する方法

Unity

1. はじめに

Unityでゲーム開発をしていると、プレイヤーの前方にRaycastを飛ばして、特定のオブジェクトや敵に当たったかどうかを検出することが必要になる場面がよくあります。例えば、シューティングゲームでは、プレイヤーが狙っているターゲットに弾が当たるかどうかを確認するためにRaycastを使います。また、アクションゲームでは、キャラクターが障害物に近づいたときにその位置を調べるためにも活用できます。

このように、Raycastはゲーム開発において非常に便利な機能です。しかし、初心者にとっては少し難しく感じることもあるかもしれません。そこで、この記事では、プレイヤーが向いている方向にRaycastを飛ばし、ヒットしたオブジェクトを確認する方法をわかりやすく解説します!

さらに、視覚的に確認できるように、Raycastの軌跡を赤い線で表示する方法もご紹介します。この手順をマスターすれば、Raycastの基本的な使い方がわかります。一緒に楽しく学んでいきましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!



2.必要な準備

Raycastを正しく動作させるためには、Unityプロジェクトの基本設定を行う必要があります。このステップでは、必要なオブジェクトをセットアップする手順を説明します。

1. 新しいプロジェクトを作成

Unityのインストールが完了したら、新しい3Dプロジェクトを作成します。

  1. Unity Hubを開き、「New Project(新しいプロジェクト)」をクリックします。
  2. テンプレートのリストから「3D」を選択します。
  3. プロジェクト名を「RaycastTutorial」に設定し、保存先を選択して「Create(作成)」をクリックします。

3. シーンの基本セットアップ

プロジェクトが開いたら、3Dシーンをセットアップします。

  1. デフォルトのシーンに含まれているMain CameraとDirectional Lightをそのまま残します。
  2. ヒエラルキーウィンドウを右クリックして「3D Object」→「Plane」を選択し、地面を作成します。
    • Planeの名前を「Ground」に変更することで管理しやすくなります。

4. プレイヤーオブジェクトの作成

次に、プレイヤーとなるCubeオブジェクトを作成します。

  1. ヒエラルキーウィンドウを右クリックして「3D Object」→「Cube」を選択します。
  2. 作成されたCubeを「Player」という名前に変更します。
  3. プレイヤーが見やすい位置に配置します。
    • 例えば、Positionを (0, 1, 0) に設定します(地面の上に浮かせるため)。

5. Raycastのターゲットとなるオブジェクトの作成

Raycastのヒット対象としていくつかのオブジェクトを配置しましょう。

  1. ヒエラルキーウィンドウを右クリックして「3D Object」→「Cube」を選択します。
  2. ターゲットCubeの名前を「Target1」に変更し、適当な場所に配置します。
    • 例:Positionを (3, 1, 0) に設定します。
  3. 必要に応じて複数のCubeを追加して、Raycastのヒットテストを楽しめる環境を作りましょう。

これで準備が整いました!次のステップでは、スクリプトを作成してプレイヤーが移動したり回転したりする方向にRaycastを発射する方法を解説します。



3. スクリプトの作成

このステップでは、プレイヤーが向いている方向にRaycastを出すためのスクリプトを作成します。さらに、Raycastのヒット判定を行い、ヒットしたオブジェクトの名前をコンソールに表示する方法を解説します。


スクリプトを作成する手順

  1. スクリプトを作成
    • Unityエディターの「プロジェクト」ウィンドウで空白の部分を右クリック。
    • 「Create」→「C# Script」を選択し、スクリプト名を RaycastController に変更します。
  2. スクリプトを開く
    • 作成した RaycastController スクリプトをダブルクリックして開きます。
    • スクリプトエディター(例:Visual Studio)が起動します。

必要なコードを記述

以下のコードを RaycastController に追加してください。コードは、プレイヤーを移動・回転させながら正面にRaycastを発射し、ヒットしたオブジェクトの名前をコンソールに出力します。

using UnityEngine;

public class RaycastController : MonoBehaviour
{
    public float moveSpeed = 5f; // プレイヤーの移動速度
    public float rotationSpeed = 100f; // プレイヤーの回転速度

    void Update()
    {
        // キーボード入力で前後に移動
        float moveDirection = Input.GetAxis("Vertical");
        transform.Translate(Vector3.forward * moveDirection * moveSpeed * Time.deltaTime);

        // キーボード入力で左右に回転
        float rotationDirection = Input.GetAxis("Horizontal");
        transform.Rotate(Vector3.up, rotationDirection * rotationSpeed * Time.deltaTime);

        // Rayの始点と向き
        Vector3 rayOrigin = transform.position; // Rayの始点をプレイヤーの位置に設定
        Vector3 rayDirection = transform.forward; // Rayの向きをプレイヤーの正面に設定

        // Raycastを描画(デバッグ用)
        Debug.DrawRay(rayOrigin, rayDirection * 10, Color.red);

        // Raycastを発射
        if (Physics.Raycast(rayOrigin, rayDirection, out RaycastHit hit, 10))
        {
            // ヒットしたオブジェクトの名前を表示
            Debug.Log("Hit object: " + hit.collider.name);
        }
    }
}

コードのポイント解説

  • 移動と回転
    • Input.GetAxis("Vertical")Input.GetAxis("Horizontal") を使い、プレイヤーを移動および回転させています。
    • これにより、キーボード操作でプレイヤーを自由に動かせるようになります。
  • Raycastの発射
    • Physics.Raycast を使用して、Rayを発射します。
    • 第1引数:Rayの始点(transform.position)。
    • 第2引数:Rayの向き(transform.forward)。
    • 第3引数:ヒットしたオブジェクトの情報を格納する RaycastHit 構造体。
    • 第4引数:Rayの最大距離。
  • Debug.DrawRay
    • デバッグ用に赤色の線を描画し、Raycastがどの方向に飛んでいるか視覚的に確認できます。

スクリプトのアタッチ

  1. ヒエラルキーウィンドウで「Player」を選択します。
  2. 作成した「RaycastController」スクリプトを「Player」オブジェクトにドラッグ&ドロップしてアタッチします。
  3. アタッチ後、インスペクターウィンドウにスクリプトの設定項目が表示されることを確認してください。

これでスクリプトの記述は完了です!次はテストプレイで動作の確認をしていきましょう!



4. 動作確認

それでは、作成したスクリプトを使って動作確認を行いましょう!以下の手順に従ってください。

1. プレイモードを開始

Unityエディター上部の「▶」ボタンをクリックして、プレイモードを開始します。

2. キーボード入力でCubeを動かす

  • 前後の移動: キーボードのWキーSキーを使って、Cubeを前後に移動させてみましょう。
  • 左右の回転: AキーDキーでCubeを左右に回転させます。

Cubeが正面を向くたびに赤いRaycastが描画されているのを確認できます。

3. ヒット判定を確認

  • オブジェクトにRaycastがヒットした場合、Unityのコンソールウィンドウに「Hit object: [オブジェクト名]」というメッセージが表示されます。
  • Raycastが触れるオブジェクトを調整して、ヒット判定が正しく動作しているか確認してください。

ヒント: コンソールウィンドウが非表示の場合は、上部メニューの「Window」→「General」→「Console」から開くことができます。

4. 距離の調整

Raycastがどれくらいの距離まで判定を行うかを調整したい場合は、以下のコードを変更します。

// Raycastの飛距離を設定
if (Physics.Raycast(rayOrigin, rayDirection, out RaycastHit hit, 10))
{
Debug.Log("Hit object: " + hit.collider.name);
}

10」の部分をお好みの距離(例: 20)に変更してください。長くするほど遠くのオブジェクトにもヒットするようになります。

5. エラーがある場合の確認

もし意図した通りに動作しない場合は、以下を確認してください。

  • スクリプトが正しくCubeオブジェクトにアタッチされているか。
  • 配置したオブジェクトにColliderが付いているか。
  • Unityのコンソールにエラーメッセージが表示されていないか。

これで動作確認は完了です!プレイヤーの動きに合わせてRaycastが正面に出るようになったら成功です。ぜひ、いろいろな距離や対象物で試してみてくださいね。



よくある質問(FAQ)

Q
Raycastが表示されない場合の対処法は?
A

Raycastが表示されない場合、以下の点を確認してください:

  • Debug.DrawRay が正しい始点と方向で設定されているか確認してください。Debug.DrawRay(rayOrigin, rayDirection * 10, Color.red); の10は、Rayの長さを指定しています。必要に応じて長さを変更してみましょう。
  • スクリプトが正しくオブジェクトにアタッチされているか確認してください。
  • シーンビューの「Gizmos」ボタンがオンになっているか確認してください。これがオフだと、Debug.DrawRayで描画したRayが表示されません。
Q
他のオブジェクトを無視して特定のオブジェクトだけをRaycastの対象にしたい場合は?
A

特定のオブジェクトだけを対象にしたい場合、Layer Maskを使うと便利です。以下のようにコードを変更することで、特定のレイヤーだけを対象にできます:

int layerMask = LayerMask.GetMask("TargetLayer");
if (Physics.Raycast(rayOrigin, rayDirection, out RaycastHit hit, 10, layerMask))
{
Debug.Log("Hit object: " + hit.collider.name);
}

「TargetLayer」は、対象にしたいオブジェクトに設定したレイヤー名に置き換えてください。

Q
Raycastのヒット距離を変更する方法は?
A

ヒット距離を変更するには、Physics.RaycastやDebug.DrawRayの引数で指定している距離の値を調整します。例えば、以下のコードで距離を15に変更できます:

Debug.DrawRay(rayOrigin, rayDirection * 15, Color.red);
if (Physics.Raycast(rayOrigin, rayDirection, out RaycastHit hit, 15))
{
Debug.Log("Hit object: " + hit.collider.name);
}

15の部分を任意の値に変更すれば、Rayの有効範囲を簡単に調整できます。

おすすめのアセット

「TopDown Engine」は、Unityでの2D・3Dアクションゲーム開発を簡単にする強力なテンプレートです。ゼロからコーディングせずに、シューティングやRPG、ダンジョン探索などの多様なトップダウン視点ゲームを構築できます。使いやすいエディター拡張と幅広いカスタマイズオプションにより、スムーズなゲームプレイ体験を提供します。マルチプレイヤー対応や詳細なAI行動設定、豊富なドキュメントとサポートで、初心者から経験者まで幅広く活用可能です。