UnityUnityメモ

Unity初心者でも簡単!二段ジャンプを防ぐ仕組みを作ろう

Unity

はじめに

ゲーム開発をしていると、「二段ジャンプ」という問題に出くわすことがあります。例えば、キャラクターが地面にいるときだけジャンプできるはずなのに、空中でさらにジャンプしてしまう現象です。このような動作は意図しない動きとしてゲームの完成度を下げる原因になってしまいます。

この記事では、Unityを使って**「二段ジャンプを防ぐ仕組み」**を簡単に実現する方法を解説します。Cubeを例に取り、Rigidbodyコンポーネントを利用して「地面に接しているときだけジャンプできる」システムを作っていきます。

それでは、さっそく始めていきましょう!

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


ジャンプするCubeを作成する

まずは、ジャンプする対象となるCubeをシーンに配置しましょう。Unityの基本操作なので、初心者の方も安心して進められます!

1. Cubeを作成する

  1. ヒエラルキーウィンドウで右クリックします。
  2. メニューから 「3D Object」 → 「Cube」 を選びます。
  3. シーンにCubeが配置されます。

このCubeが、ジャンプするキャラクターとして動作します。

2. Rigidbodyを追加する

Cubeが物理的にジャンプできるようにするために、Rigidbodyコンポーネントを追加します。

  1. Cubeを選択した状態で、インスペクターウィンドウを確認します。
  2. 「Add Component」ボタンをクリックします。
  3. 検索ボックスに「Rigidbody」と入力し、リストから Rigidbody を選択します。

これで、Cubeに重力や物理的な動きが適用されるようになります。

ここまでで、ジャンプするための基礎が整いました!次は、ジャンプ制御用のスクリプトを作成していきましょう。




3. ジャンプ制御スクリプトの作成

次に、Cubeが着地している時だけジャンプできるようにするためのスクリプトを作成します。以下の手順で進めましょう。

スクリプトの作成

  1. プロジェクトウィンドウを右クリック
    • 「Create」 → 「C# Script」を選択します。
    • 新しいスクリプトに「JumpController」という名前を付けます。
  2. スクリプトを編集
    • 作成した「JumpController」をダブルクリックして開きます。
    • 以下のコードを入力してください。
using UnityEngine;

public class JumpController : MonoBehaviour
{
    public float jumpForce = 5f;  // ジャンプの強さを設定
    private bool isGrounded;      // 地面に接しているかどうかを判定

    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();  // Rigidbodyを取得
    }

    void Update()
    {
        // 地面に接していて、かつマウスの左クリックを押したらジャンプ
        if (isGrounded && Input.GetMouseButtonDown(0))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }

    // 地面に接したときにisGroundedをtrueにする
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }

    // 地面から離れたときにisGroundedをfalseにする
    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }
}

スクリプトの解説

  • public float jumpForce
    • ジャンプの強さを調整するための変数です。初期値は5に設定していますが、必要に応じて変更できます。
  • isGrounded
    • 地面に接しているかどうかを判定するためのフラグです。このフラグを利用して、ジャンプを1回だけに制御します。
  • OnCollisionEnterOnCollisionExit
    • Unityの物理イベントを使って、Cubeが地面に接したタイミングで isGroundedtrue に、離れたタイミングで false に設定します。
  • rb.AddForce
    • Rigidbodyに力を加えることでCubeをジャンプさせます。ForceMode.Impulse は瞬間的な力を加える設定です。

スクリプトをCubeにアタッチ

  1. Cubeを選択した状態で、インスペクターウィンドウの「Add Component」をクリックします。
  2. 「JumpController」を検索し、アタッチします。

これでジャンプ制御スクリプトの設定は完了です!次のステップでは地面(Plane)を作成し、Cubeがジャンプできる条件を整えていきます。




4. 地面(Plane)の作成

次に、ジャンプの対象となるCubeが接する「地面」を作成しましょう。Unityでは、地面に「タグ」を設定することで、接地判定を簡単に行うことができます。以下の手順で進めていきます。

Planeの作成方法

  1. Planeを作成する
    • ヒエラルキーウィンドウで右クリックします。
    • メニューから「3D Object」 → 「Plane」を選択します。
    • シーンビューに大きな平面が表示されるのを確認しましょう。
  2. Planeの位置とサイズを調整する
    • 作成したPlaneを選択し、インスペクターウィンドウで「Transform」の値を確認します。
    • 位置(Position)は (0, 0, 0)、回転(Rotation)は (0, 0, 0) に設定するのがおすすめです。
    • 必要に応じて、スケール(Scale)を (5, 1, 5) など大きめに設定して、広い地面を作成しましょう。

タグの設定方法

  1. タグを作成する
    • ヒエラルキーでPlaneを選択した状態で、インスペクターウィンドウを確認します。
    • 上部にある「Tag」のドロップダウンをクリックし、「Add Tag…」を選択します。
    • 「Tags and Layers」ウィンドウが開くので、+ボタンをクリックして新しいタグを作成します。
    • 名前を「Ground」と入力し、Enterキーを押して保存します。
  2. Planeにタグを設定する
    • 再びPlaneを選択し、インスペクターウィンドウの「Tag」ドロップダウンをクリックします。
    • 作成した「Ground」を選択してタグを適用します。

タグ設定の確認

ここまで設定が正しければ、Planeは「Ground」タグが付与された状態になっています。このタグを利用することで、Cubeが地面に接しているかどうかを判定できるようになります。

これで地面の作成は完了です。次のステップでは、作成したスクリプトをCubeにアタッチして、実際にジャンプ動作を確認していきます。お楽しみに!




5.動作確認と応用

1. 動作確認をしてみよう

すべての準備が整ったら、いよいよ実際に動作を確認してみましょう!以下の手順で進めてください。

  1. 再生ボタンをクリック
    シーンを保存したら、Unityエディターの上部にある「再生ボタン(▶)」をクリックしてゲームを実行します。
  2. Cubeをジャンプさせる
    ゲームウィンドウでマウスの左クリックを押してみてください。Cubeが上に飛び上がるはずです。
  3. 二段ジャンプが防止されているか確認
    空中で何度クリックしても、ジャンプができないことを確認しましょう。CubeがPlane(地面)に着地すると、再びジャンプできるようになります。

2. 問題がある場合のチェックポイント

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

  • Planeに「Ground」タグが設定されているか
    Planeが正しいタグを持っていないと、Cubeが接地を認識できません。
  • RigidbodyがCubeに追加されているか
    Rigidbodyがないと、物理的な挙動が適用されずジャンプが機能しません。
  • スクリプト内のコードにミスがないか
    特に「OnCollisionEnter」や「OnCollisionExit」のメソッド内でタグを正しく比較しているか確認しましょう。

3. 応用してみよう

この仕組みを応用すれば、より高度なジャンプ制御が可能になります。例えば:

  • 多段ジャンプの実装
    ジャンプ可能な回数を数える変数を追加すれば、プレイヤーに二段ジャンプや三段ジャンプを許可することができます。
  • ジャンプ可能エリアを制限
    タグやレイヤーを活用して、特定のエリアやオブジェクトの上でのみジャンプできるように設定することも可能です。
  • アニメーションの追加
    ジャンプ時にキャラクターが動作するアニメーションを付け加えると、よりリアルで魅力的な演出になります。

Unityではアイデア次第で無限に可能性が広がります。ぜひ今回学んだ基礎を活かして、オリジナルのジャンプシステムを作ってみてください!


おすすめのアセット

「Geometry Jump」は、リリース準備が整った完全なゲームテンプレートです。シンプルなジャンプゲームの基本機能が含まれており、プレイヤーが障害物を避けながら進むゲームを簡単に作成できます。Unity初心者でも扱いやすく、無限に続くステージやスコアシステムも搭載。グラフィックやゲームプレイのカスタマイズも可能なので、自分だけのゲームを作りたい方におすすめです。モバイルゲーム開発にも最適です。


あわせて読みたい

二段ジャンプ防止の実装を学んだあなたに、さらにジャンプや移動制御の理解を深めるための関連記事を厳選してご紹介します。


よくある質問

Q
なぜPlaneにタグを設定する必要があるの?
A

タグを設定することで、スクリプトが地面(Plane)と他のオブジェクトを区別できるようになります。この記事では、Cubeが「Ground」タグを持つオブジェクトに接触しているかを判定することで、ジャンプ可能な状態を管理しています。もしタグを設定しないと、スクリプトが他のオブジェクトとの衝突を正しく認識できず、意図しない挙動を引き起こす可能性があります。

Q
ジャンプ力を調整するには?
A

スクリプト内のjumpForceという変数を変更することで、ジャンプ力を簡単に調整できます。たとえば、次のように値を変更してください:

public float jumpForce = 10f; // ジャンプ力を強くする

値を大きくするほどジャンプ力が強くなり、小さくするほど低くなります。シーンを再生しながら適切な値を試してみましょう。

Q
Rigidbodyを使わないジャンプ制御は可能?
A

はい、可能です。たとえば、Transform.positionを直接変更する方法や、CharacterControllerを使用する方法があります。ただし、Rigidbodyを使うと物理挙動が自動的に処理されるため、初心者には扱いやすい選択肢です。物理を使わない方法はスクリプトの複雑さが増すため、まずはRigidbodyを使った方法で基本を学ぶことをおすすめします。

C-BA Unity-memo
タイトルとURLをコピーしました