# ジャンプを実装

ジャンプは前後左右の移動とは関係ないため、別のスクリプトとして実装ができる。同じPlayerMoveでも実装できるが、「一つのスクリプト＝１つの責任」の考えを従い、今回はジャンプ専用の「PlayerJump」スクリプトを作成しましょう。

このスクリプトは「Jump」という入力（プロジェクト設定→入力マネージャーを確認）が発動したら、一旦Y軸の速度を変えて、上がるようにしましょう。また、ジャンプ力をUnityで変えられるようにしましょう。

## スクリプト

```c#
using UnityEngine;

// ジャンプ機能を追加するスクリプト
public class PlayerJump : MonoBehaviour
{
    // ジャンプ力を設定する
    [SerializeField] 
    private float jumpPower = 5.0f;

    // 速度を変えるためのリジッドボディ
    private Rigidbody rbody;

    // ジャンプしろ！
    private bool doJump;
    
    void Start()
    {
        // コンポネント取得
        rbody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // ジャンプしたか？
        if (Input.GetButtonDown("Jump"))
            doJump = true;
    }
    
    private void FixedUpdate()
    {
        // ジャンプしていなければ、なにもしない
        if (!doJump)
            return; // メソッド終了
        
        // 現在の速度を取得
        Vector3 v = rbody.linearVelocity;
        
        // Yだけを上書き
        v.y = jumpPower;
        
        // 速度を設定
        rbody.linearVelocity = v;
        
        // ジャンプしたので、doJump を false に戻す
        doJump = false;
    }
}
```

これでジャンプを確認しましょう。

#### 問題：多重ジャンプ

<table border="1" id="bkmrk-%E3%80%80%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%8C%E3%80%81%E7%A9%BA%E4%B8%AD%E3%81%A7%E3%81%82" style="border-collapse: collapse; width: 100%; border-width: 0px;"><colgroup><col style="width: 69.3397%;"></col><col style="width: 30.6206%;"></col></colgroup><tbody><tr><td style="border-width: 0px;"> ジャンプできるようになったが、空中であってもジャンプができるので、ジャンプし続けば空に飛んでしまう！これを防ぐには、現状にジャンプできるかどうかの確認が必要。

 今回は「足元の下に何もなければ（つまり空中であること）、ジャンプができない」ことがジャンプの条件にしましょう。

 では、どうやって足元に地面の存在確認できるのか？これを学んだ「`Raycast`」で解決ができる。足元からビーム（レイ）を発射し、何も当たらなければ、空中であることを確認ができる。

</td><td style="border-width: 0px;">![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/8b6image.png)

</td></tr></tbody></table>

では、`PlayerJump` を更新し、地面の時だけジャンプできるようにしましょう。まず、地面の確認メソッド：

```c#
// 現在、地面を触れている？
private bool IsOnFloor()
{
    // 確認する距離。ここは適切に調整
    const float CheckDistance = 0.2f;
    
    // レイが始まる位置。現在位置からもう少し上から始まる
    Vector3 origin = transform.position + Vector3.up * 0.01f;
    
    // origin から下に向かい、決まった距離のビームを発射
    // 何か当たったら「true」を返す
    return Physics.Raycast(origin, Vector3.down, CheckDistance);
}
```

そして、Update で：

```c#
void Update()
{
    // ジャンプしたか？
    if (IsOnFloor() && Input.GetButtonDown("Jump"))
        doJump = true;
}
```

#### 問題：壁にくっつける

次の試してみてください。台に向かって、ジャンプし、壁を当たってください。引き続きに壁に力を与えると、主人公が落下せず、壁にくっつけてしまう。魔雑のため、滑らずにそこでとまってしまう。

この問題を「Physics Material」で解決ができる。主人公のコライダーが魔雑ないようにし、滑りやすくしましょう。プロジェクトフォルダーの中に新しい「Physics Material」を作成し、名前は「PlayerSlide」にする

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/0l0image.png)

魔雑「０」弾み「０」で、どちらにも「最低数値」を使用。 Player のコライダーに「PlayerSlide」をアサインすれば完成

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/AULimage.png)