UnityUnityメモ

Unity初心者必見!Raycastを使ったダブルジャンプの実装手順

Unity

1. はじめに

Unityでゲームを作るとき、ジャンプするだけのキャラクターでは少し物足りないと感じたことはありませんか?今回はそんなときにおすすめの「ダブルジャンプ」の仕組みを一緒に作ってみましょう!

この記事を読むとこんなことができるようになります:

  • 床に接地している時に1回目のジャンプを実行
  • 空中でクリックすると、もう一度だけ追加ジャンプが可能
  • プレイヤーキャラクターの動きをもっと楽しくカスタマイズ!

スクリプトの内容もとてもシンプルで、Unity初心者の方でも安心して取り組める内容になっています。「ジャンプ」の動きの基本を理解して、さらに「ダブルジャンプ」をゲームに組み込んでみましょう!あなたのゲームに新しい可能性が広がりますよ。

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



2. ダブルジャンプの仕組みを解説

「ダブルジャンプ」とは、プレイヤーキャラクターが1回目のジャンプ後に空中でもう一度ジャンプできるアクションのことです。2段階のジャンプを可能にすることで、移動や回避の幅が広がり、ゲームプレイがより楽しくなります。

今回作成する仕組みは以下のように動作します:

基本の動作フロー

  1. 床に接地しているときにプレイヤーがジャンプボタンを押すと、ジャンプが発動します。
  2. ジャンプ中、プレイヤーが再びジャンプボタンを押すと、空中でもう一度ジャンプ(2回目のジャンプ)が可能になります。
  3. ダブルジャンプ後は再び床に接地するまで追加のジャンプができないようにします。

Raycastによる接地判定

ジャンプできる条件を判断するために、床との接触を確認します。具体的には、**Raycast(レイキャスト)**というUnityの機能を使用します。

  • Raycastとは?
    レイキャストは、指定した方向に見えない「光線」を飛ばし、その光線がオブジェクトに当たるかどうかを判定する機能です。
    これを使って、プレイヤーキャラクターが「床に接地している状態」かどうかを確認します。
  • 今回の設定
    • プレイヤーキャラクター(Cube)の真下に向かって光線を飛ばします。
    • 光線が一定の距離内で床に当たる場合、接地していると判定します。
    • Unityエディタ上で確認しやすいよう、光線を赤い線で可視化します(Debug.DrawRayを使用)。

ジャンプの挙動を制御する変数

ジャンプをコントロールするために、以下の変数を使用します:

  1. upForce
    ジャンプ力を設定します。この値を調整することでジャンプの高さを変更できます。
  2. doubleJump
    ダブルジャンプが可能かどうかを管理するフラグです。
    • 地面に接地している間はtrueになります。
    • 空中で1回ジャンプした後、falseになります。
  3. distance
    Raycastが地面との接触を判定する距離を設定します。この値を変えると、接地判定の範囲を広げたり狭めたりできます。

プレイヤーの入力に応じた動き

プレイヤーの入力(今回は左クリック)を取得し、接地状態やダブルジャンプのフラグに基づいて動作を分岐させます:

  1. 床に接地している場合
    左クリックでAddForceを使い、Y軸方向に力を加えてジャンプ。
  2. 空中にいる場合
    • ダブルジャンプが可能なら、再び力を加えて2回目のジャンプを発動。
    • ダブルジャンプ後はdoubleJumpfalseにすることで、追加のジャンプを防止。

こうして、「接地判定」「入力」「物理挙動」の3つを組み合わせることで、シンプルで動きの良いダブルジャンプを実現できます!




3. 実装手順

Unityでダブルジャンプを作る準備をしましょう!
以下の手順に沿って進めれば、簡単にダブルジャンプの仕組みを作ることができます。


手順1: Unityプロジェクトを作成

  1. Unityを開く
    Unity Hubから新しい3Dプロジェクトを作成します。プロジェクト名は「DoubleJumpTutorial」などにするとわかりやすいです。
  2. シーンにオブジェクトを配置する
    • 床を作る
      ヒエラルキーウィンドウで右クリックし、「3D Object」→「Plane」を選択します。これがプレイヤーがジャンプする床になります。
    • プレイヤー(Cube)を作る
      再び右クリックし、「3D Object」→「Cube」を選択します。このCubeがプレイヤーキャラクターとして動きます。名前を「Player」に変更しておくと管理しやすいです。
  3. Cubeの位置を調整する
    • Cube(Player)の高さを少し上げます。
      「Transform」コンポーネントのPosition Y1に設定します。これでCubeが床の上に浮かぶ状態になります。

手順2: Cubeに物理演算を追加

  1. Cubeを選択
    ヒエラルキーでCube(Player)をクリックして選択します。
  2. Rigidbodyを追加
    インスペクターウィンドウで「Add Component」ボタンをクリックし、「Rigidbody」と検索して追加します。これにより、物理演算が適用され、重力の影響で自然に落ちる動きが加わります。

手順3: ダブルジャンプのスクリプトを作成

  1. 新しいスクリプトを作成
    プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選択します。名前を「PlayerJump」に変更します。
  2. スクリプトをCubeにアタッチ
    作成した「PlayerJump」スクリプトをCube(Player)にドラッグ&ドロップしてアタッチします。

手順4: スクリプトを記述

  1. スクリプトをダブルクリックして開く
    作成した「PlayerJump.cs」をダブルクリックして、スクリプトエディタで開きます。
  2. 以下のコードを記述
    スクリプトを開いて以下のコードを入力して保存します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerJump : MonoBehaviour
{
    // Rigidbodyを格納するための変数
    private Rigidbody rb;
    // ジャンプ力の強さを決める変数
    private int upForce;
    // 接地判定の距離
    private float distance;
    // ダブルジャンプが可能かどうかを管理するフラグ
    private bool doubleJump;

    void Start()
    {
        // Rigidbodyコンポーネントを取得
        rb = GetComponent<Rigidbody>();
        // ジャンプ力を300に設定
        upForce = 300;
        // 接地判定のRayの長さを1.0に設定
        distance = 1.0f;
    }

    void Update()
    {
        // Rayの発射位置をCubeの中心に設定
        Vector3 rayPosition = transform.position + new Vector3(0.0f, 0.0f, 0.0f);

        // 下方向(Vector3.down)にRayを発射する
        Ray ray = new Ray(rayPosition, Vector3.down);

        // Rayが指定した距離内で床に当たったかどうかを判定
        bool isGround = Physics.Raycast(ray, distance);

        // デバッグ用の赤い線をシーンビューに表示
        Debug.DrawRay(rayPosition, Vector3.down * distance, Color.red);

        // 床に接地している場合、ダブルジャンプを可能にする
        if (isGround)
        {
            doubleJump = true;
        }

        // 左クリックが押されたときの処理
        if (Input.GetMouseButtonDown(0))
        {
            // 床に接地している場合
            if (isGround)
            {
                // Rigidbodyに上方向の力を加えてジャンプする
                rb.AddForce(new Vector3(0, upForce, 0));
            }
            else
            {
                // 空中にいる場合、ダブルジャンプが可能ならジャンプ
                if (doubleJump)
                {
                    // Rigidbodyに上方向の力を加える
                    rb.AddForce(new Vector3(0, upForce, 0));
                    // ダブルジャンプを無効にする
                    doubleJump = false;
                }
            }
        }
    }
}

4. スクリプト内容の解説

ここでは「PlayerJump.cs」の中身を詳しく解説します。コードの一行一行にどんな役割があるのかを見ていきましょう。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

① 必要なライブラリのインポート

  • Unityの基本的な機能(MonoBehaviourRigidbodyなど)を使うために、UnityEngineをインポートしています。
  • 他のライブラリは今回使っていませんが、拡張性を持たせるためにSystem.CollectionsSystem.Collections.Genericを残しています。

public class PlayerJump : MonoBehaviour
{
private Rigidbody rb;
private int upForce;
private float distance;
private bool doubleJump;

② クラスの宣言と変数の定義

  • Rigidbody rb: ジャンプ力を加えるためにCubeのRigidbodyコンポーネントを操作します。
  • int upForce: ジャンプする力の大きさを設定します。初期値は後ほどStart300に設定。
  • float distance: Raycast(床との接触判定)を行う際の距離を定義します。ここでは1.0fに設定。
  • bool doubleJump: ダブルジャンプが可能かどうかを管理するフラグです。

void Start()
{
rb = GetComponent<Rigidbody>();
upForce = 300;
distance = 1.0f;
}

Start()メソッド

  • ゲーム開始時に一度だけ呼び出されるメソッドです。
  1. GetComponent<Rigidbody>(): CubeにアタッチされているRigidbodyコンポーネントを取得して、rbに格納します。
  2. upForcedistanceの初期化:
    • upForce = 300: ジャンプの力を300に設定。
    • distance = 1.0f: 接地判定の範囲を1.0に設定します。

void Update()
{
Vector3 rayPosition = transform.position + new Vector3(0.0f, 0.0f, 0.0f);
Ray ray = new Ray(rayPosition, Vector3.down);
bool isGround = Physics.Raycast(ray, distance);
Debug.DrawRay(rayPosition, Vector3.down * distance, Color.red);

Update()メソッドの前半(接地判定)

  • Update()メソッドは毎フレーム実行され、ゲーム中のプレイヤーの動きを制御します。
  1. rayPosition: Cubeの現在位置からRayを飛ばすためのスタート地点です。
    • ここではCubeの中心から真下(Vector3.down)に向かってRayを飛ばします。
  2. Ray ray: Raycastを作成。真下に飛ばして床に接触しているか確認します。
  3. Physics.Raycast(ray, distance): Rayがdistanceの範囲内で何かに当たった場合にtrueを返します。この結果をisGroundという変数に格納。
  4. Debug.DrawRay: 赤い線でRayを可視化します(ゲーム画面ではなくシーンビューで確認できます)。

 if (isGround)
{
doubleJump = true;
}

⑤ 接地しているかどうかの判定

  • if (isGround):
    • isGroundtrueなら、床に接地している状態です。
    • この場合、doubleJumptrueにしてダブルジャンプを可能にします。

 if (Input.GetMouseButtonDown(0))
{
if (isGround)
rb.AddForce(new Vector3(0, upForce, 0));
else
{
if (doubleJump)
{
rb.AddForce(new Vector3(0, upForce, 0));
doubleJump = false;
}
}
}
}

⑥ ジャンプの入力処理

  1. Input.GetMouseButtonDown(0):
    • マウスの左クリックを検知します。ジャンプのトリガーとなる部分です。
  2. 接地している場合(if (isGround):
    • 接地しているときにクリックされたら、AddForceで上方向(Vector3(0, upForce, 0))にジャンプ力を加えます。
  3. 空中の場合(else:
    • ダブルジャンプが可能(if (doubleJump))なら、再度AddForceでジャンプ力を加えます。
    • ダブルジャンプを使用した後はdoubleJumpfalseにして、空中での追加ジャンプを防ぎます。

補足ポイント

  • Physics.Raycastを使った接地判定:
    • UnityのPhysicsエンジンを利用して、正確な接地判定を行っています。distanceの値を調整すれば、Cubeの大きさや床との距離に合わせて設定可能です。
  • ダブルジャンプのフラグ管理:
    • doubleJumpというフラグを利用して、空中でのジャンプを1回だけ許可する仕組みを実現しています。

これらを組み合わせることで、接地判定を行いつつ、通常ジャンプとダブルジャンプを自然な流れで実装できるようになっています。




4. 動作確認

さて、スクリプトの記述が完了したら、次は動作確認をしてみましょう!以下の手順で、正しく動作するか確認してください。


手順1: ゲームを再生

Unityエディター上部にある「再生ボタン(三角形)」をクリックして、ゲームを再生します。


手順2: ジャンプ操作を試す

  1. 通常ジャンプ
    • 床に接地している状態で、左クリックしてみましょう。
    • Cube(プレイヤー)が1回ジャンプします。高さが適切でない場合は、スクリプト内のupForceの値を調整してください。
  2. ダブルジャンプ
    • ジャンプ中に、もう一度左クリックしてみましょう。
    • 空中でもう一度ジャンプができるはずです。ここでダブルジャンプが正しく実装されているか確認してください。
  3. 空中での操作制限
    • 空中でさらにクリックを連続して試してみましょう。
    • ダブルジャンプ後に追加のジャンプが発動しない場合、スクリプトが正しく動作しています。

手順3: Debug.DrawRayを活用した確認

再生中にシーンビューを開くと、Cubeの下に赤い線が描かれているのが見えるはずです。この赤い線はRaycastによる床との接地判定を可視化しています。

  • 赤い線が床に届いている状態:接地している(isGround = true)
  • 赤い線が床に届いていない状態:空中にいる(isGround = false)

これにより、接地判定が正常に機能しているかを簡単に確認できます。


手順4: 問題がある場合のチェックポイント

もし正しく動作しない場合は、以下を確認してください:

  1. Rigidbodyがアタッチされているか?
    • CubeにRigidbodyコンポーネントが追加されていないと、物理挙動が発生しません。
  2. スクリプトがアタッチされているか?
    • 「PlayerJump」スクリプトがCubeに正しくアタッチされているか確認してください。
  3. スクリプトの記述ミス
    • コードのスペルミスや構文ミスがないか再度確認してください。

これで動作確認が完了です!ダブルジャンプがうまく動作していれば成功です。ぜひゲーム内で自由にジャンプを楽しんでください!



5. よくある質問(Q&A)

Q
ジャンプ力を調整したい場合はどうすればいいですか?
A

スクリプト内のupForceの値を変更しましょう。例えば、300500に変更するとジャンプ力が強くなります。

Q
接地判定の範囲を広げたい場合は?
A

スクリプト内のdistanceの値を大きくしましょう。例えば、1.0f1.5fにすることで、接地判定が広がります。

Q
クリック以外のキーでジャンプさせたい場合は?
A

Input.GetMouseButtonDown(0)Input.GetKeyDown(KeyCode.Space)などに変更すれば、スペースキーでジャンプできます。

6. まとめ

今回の記事では、Unityで「ダブルジャンプ」を実装する方法を詳しく解説しました。床に接地している時に通常ジャンプを行い、空中で1回だけ追加ジャンプできる仕組みを作ることで、プレイヤーキャラクターの動きに奥行きを加えられます。

重要なポイントは次の3つです:

  1. Raycastで床との接地判定を行うこと。
  2. RigidbodyのAddForceを使ってジャンプを実現すること。
  3. ダブルジャンプを管理するフラグ(doubleJump)を活用すること。

これらを組み合わせることで、シンプルながらも柔軟なジャンプ機能が作れます。ジャンプ力や操作方法を調整することで、ゲームに合った最適な動きをカスタマイズすることも可能です。

次のステップ: この記事で紹介した内容をベースに、さらに以下のような応用を試してみてください:

  • トリプルジャンプやホバリングのような新しい動きを追加する。
  • ジャンプ時にエフェクトやサウンドを付けて、演出を強化する。
  • 接地判定の範囲を広げたり、動きの挙動をリアルに調整する。

Unityの学習は、一つひとつの仕組みを実際に作りながら進めるのが近道です。ぜひこの記事を参考に、自分のゲーム開発スキルをどんどん伸ばしていってくださいね!