UnityUnityメモ

Unity初心者でも簡単!Raycastを使った地面接触判定とジャンプ機能を作る方法

Unity

1. はじめに

Unityには「Raycast」という機能があり、これはオブジェクトから光線を発射して、他のオブジェクトとの衝突を検出するものです。ゲーム開発では、地面に接触しているかを判定したり、敵に命中したかを確認したりする際によく使われます。

例えば、キャラクターがジャンプしているか、地面に着地しているかを判定する場合、このRaycastを使用すれば簡単に確認できます。Raycastは目には見えませんが、Unityのデバッグ機能を使うことで、その光線を可視化しながらテストすることも可能です。

この記事では、Unity初心者でもわかりやすいステップで、Raycastを使った地面接触判定を実装し、キャラクターがジャンプできる仕組みを作る方法を解説します。基本的な物理挙動やスクリプトの作成も含まれているので、ぜひ楽しみながら学んでください!

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



プロジェクトの準備

UnityでRaycastを使った接地判定を作るために、まずはシーンの準備をしましょう。このセクションでは、Cube(プレイヤーキャラクター)とPlane(地面)を配置する方法を説明します。

1. Cubeを配置する

  1. ヒエラルキーウィンドウを右クリックします。
  2. 3D Object」→「Cube」を選択します。
    • これでシーンにCubeが追加されます。
  3. Cubeを選択し、インスペクターウィンドウでTransformの位置を次のように設定します:
    • Position: (0, 1, 0)
    • Scale: (1, 1, 1)
  4. このCubeがプレイヤーキャラクターとして動作します。

2. Plane(地面)を配置する

  1. 再びヒエラルキーウィンドウを右クリックします。
  2. 3D Object」→「Plane」を選択します。
    • Planeが地面としてシーンに追加されます。
  3. Planeを選択し、インスペクターウィンドウでTransformのスケールを次のように設定します:
    • Scale: (5, 1, 5)
    • これによりPlaneが広がり、Cubeが落ちる心配がなくなります。

3. カメラとライトの確認

  • シーンビューを確認し、CubeとPlaneが正しく見える位置にカメラを調整してください。
  • 必要であれば、ライト(Directional Light)の位置や角度を変更して、全体が明るく見えるように設定しましょう。

これで、シーンの準備は完了です!次のセクションでは、Rigidbodyを追加してCubeに物理挙動を設定する方法を説明します。



Rigidbodyを追加して物理挙動を設定

このステップでは、CubeにRigidbodyを追加して、物理挙動を適用する方法を解説します。これにより、Cubeが重力の影響を受け、ジャンプすることが可能になります。


1. Rigidbodyを追加する

まず、ヒエラルキーウィンドウでCubeを選択します。次に、インスペクターで以下の手順を行います。

  1. 「Add Component」ボタンをクリック
    • インスペクターの下部にある青いボタンです。
  2. 「Rigidbody」を検索して選択
    • ドロップダウンメニューに「Rigidbody」が表示されます。それをクリックしてCubeに追加します。

2. Rigidbodyの設定を確認する

Rigidbodyを追加すると、以下のような項目が自動的に設定されます。

  • Mass(質量):1
    • Cubeの質量を設定します。この値を変更するとジャンプの挙動に影響します。
  • Drag(空気抵抗):0
    • 物体が移動するときの空気抵抗です。通常は0で問題ありません。
  • Use Gravity(重力を使用):チェックオン
    • Cubeが重力の影響を受けるようにする設定です。このチェックを外すと重力が無効になります。

この設定により、CubeはUnityの物理システムに従い、自然な挙動をします。


3. テストしてみる

ここまでの設定を確認するために、シーンを再生してみましょう。

  1. Unityエディターの上部にある**再生ボタン(▶)**をクリックします。
  2. シーン内でCubeが重力に従い、Plane(床)の上に落ちることを確認します。

これで、Cubeが物理挙動を持つオブジェクトになりました!次は、Raycastを使った接触判定をスクリプトで追加していきましょう。



4. Raycastを使った地面接触判定

この記事では、Raycastを使った地面接触判定を実装する手順を説明します。Cubeの下にRay(光線)を発射し、それを使って接地しているかどうかを確認する仕組みを作ります。


スクリプトを作成する

まず、新しいスクリプトを作成してCubeに接地判定の機能を追加しましょう。

  1. スクリプトを作成
    • プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選びます。
    • スクリプト名を「CubeController」に設定します。
  2. スクリプトをCubeにアタッチ
    • ヒエラルキーウィンドウでCubeを選択し、作成したスクリプトをドラッグしてアタッチします。

コードを記述する

以下のコードを「CubeController」スクリプトに入力してください。

using UnityEngine;

public class CubeController : MonoBehaviour
{
    public float jumpForce = 5f; // ジャンプ力をInspectorで設定可能
    private Rigidbody rb;
    private float distance = 1.0f; // Rayの長さ
    private bool isGrounded; // 地面接触判定用変数

    void Start()
    {
        // Rigidbodyコンポーネントを取得
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // Cubeの下にRayを発射(現在位置から下方向に向けて)
        Vector3 rayPosition = transform.position;
        Ray ray = new Ray(rayPosition, Vector3.down);
        isGrounded = Physics.Raycast(ray, distance); // Rayが地面に当たったかを判定

        // SceneビューでRayを可視化
        Debug.DrawRay(rayPosition, Vector3.down * distance, Color.red);

        // 接地している場合にジャンプを許可
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); // ジャンプ力を適用
        }

        // 接地状態をコンソールに出力
        Debug.Log("Is Grounded: " + isGrounded);
    }
}

コードのポイント解説

  • Rayを発射する
    Ray ray = new Ray(rayPosition, Vector3.down);
    isGrounded = Physics.Raycast(ray, distance);
    RayをCubeの現在位置から下方向に向けて発射し、接地判定を行います。Physics.Raycast関数を使い、指定した距離内で接触するオブジェクトがあればtrueを返します。
  • 可視化
    Debug.DrawRay(rayPosition, Vector3.down * distance, Color.red);
    Debug.DrawRayを使うことで、Sceneビュー上でRayが赤色の線として表示され、どこに発射されているか確認できます。
  • ジャンプ処理
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded){ rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); }
    接地しているときだけスペースキーでジャンプできるようにしています。

これで、Raycastを使った地面接触判定の実装が完了しました!問題が発生した場合は次のセクション「テストとデバッグ」を参照してください。



5. テストとデバッグ

スクリプトを作成し、Cubeにアタッチしたら、実際にシーンで動作を確認してみましょう。ここではテストとデバッグの手順を詳しく説明します。

スクリプトの動作確認

  1. プレイモードに切り替える
    • Unityエディターの上部にある「▶」(再生ボタン)をクリックして、プレイモードに入ります。
    • シーン内のCubeが落下し、Plane(床)の上に止まることを確認してください。
  2. ジャンプ機能のテスト
    • キーボードのスペースキーを押してCubeをジャンプさせます。
    • 正常にジャンプできる場合、Cubeが上に跳ね上がり、再び地面に落ちてくるはずです。
  3. Raycastの可視化
    • シーンビューでCubeの下に赤い線(Ray)が表示されているか確認します。
    • 赤い線がPlaneに届いている場合、接地判定が正しく動作しています。

デバッグ方法

スクリプトが期待通りに動作しない場合は、以下のポイントを確認しましょう。

  1. コンソールを確認
    • Unityの「Console」ウィンドウを開き、エラーや警告メッセージを確認します。
    • 例えば、「NullReferenceException」というエラーが出た場合、Rigidbodyが正しく設定されていない可能性があります。
  2. ジャンプが反応しない場合
    • Rigidbodyの設定を確認
      • Cubeに「Rigidbody」コンポーネントがアタッチされているか確認してください。
      • Rigidbodyの「Use Gravity」がチェックされているかも確認します。
    • スペースキーの入力
      • 「Input.GetKeyDown(KeyCode.Space)」が正しく記述されているかスクリプトを確認してください。
  3. Raycastの距離を調整
    • distanceの値が小さすぎると接地判定がうまくいかないことがあります。
      • スクリプト内のdistanceを例えば1.5fなどに増やしてみてください。
  4. Debug.Logを活用
    • スクリプト内でDebug.Logを使用して、isGroundedの値をリアルタイムで確認できます。Debug.Log("Is Grounded: " + isGrounded);
    • 接地していない場合はfalse、接地している場合はtrueと表示されるはずです。

無事にスクリプトが動作することを確認したら、次はこの機能を活用してゲームに応用するアイデアを考えてみましょう。例えば、Cubeのジャンプ力を変えたり、異なるオブジェクトでRaycastを試すなど、いろいろな実験をしてみてください。



よくある質問 (FAQ)

Q
スクリプトが動かない場合はどうすればいいですか?
A

まず、以下のポイントを確認してください。

  • スクリプトがCubeにアタッチされているかを確認します。
  • Unityエディターの「Console」タブにエラーメッセージが表示されていないかを確認します。
  • スクリプト内でスペルミスがないか(特に「Rigidbody」や「Physics.Raycast」などのクラス名)をチェックしましょう。 エラーが解決しない場合は、エラーメッセージをコピーしてネットで検索するのも効果的です。
Q
スペースキーを押してもCubeがジャンプしません。どうしてですか?
A

以下の点を確認してください。

  • RigidbodyがCubeに追加されているか確認します。
  • 「Jump Force」の値が小さすぎないか確認してください(例えば、0.1などでは力が足りません)。
  • Cubeが地面(Plane)から少し浮いていないか確認してください。Raycastは一定の距離内に障害物がないと地面を検出しません。スクリプト内のdistanceを適宜調整してください。
Q
Raycastの距離設定を変えたい場合はどうすればいいですか?
A

スクリプト内のdistanceの値を変更してください。例えば、以下の行を探します:

private float distance = 1.0f; // Rayの長さ

ここを0.5f1.5fなどに変更することで、地面までの距離の検出範囲を調整できます。ただし、距離を短くしすぎると正しく検出されなくなる場合があるので注意してください。

おすすめのアセット

「500+ Stylized Floor & Ground Textures」は、コンクリート、セラミック、石など、様々な質感を含むスタイライズドな床・地面用テクスチャセットです。500種類以上の高品質な2Dテクスチャが収録されており、ファンタジー、現代的なシーン、低ポリゴンスタイルのゲームなど、幅広いプロジェクトに活用できます。