ブログ

(Unity2019)ジャンプの実装(二段ジャンプの禁止)

(1)Ballスクリプトを改良する

・ある特定のボタンを押すとボールがジャンプする仕組みを作ります。

「Ball」スクリプトをダブルクリック。

「コードを確認」の中の「★追加(ジャンプ)」部分を追加してください。

・コードが書けたらチェックしましょう。

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

public class Ball : MonoBehaviour
{
    public float moveSpeed;
    private Rigidbody rb;
    public AudioClip coinGet;

    // ★追加(ジャンプ)
    public float jumpSpeed;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveH, 0, moveV);
        rb.AddForce(movement * moveSpeed);

        // ★追加(ジャンプ)
        if (Input.GetButtonDown("Jump"))
        {
            rb.velocity = Vector3.up * jumpSpeed;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Coin"))
        {
            Destroy(other.gameObject);
            AudioSource.PlayClipAtPoint(coinGet, transform.position);
        }
    }
}

(2)Inspectorで設定する

・「Inspector」上で「Jump Speed」を設定しましょう。

・これで準備が完了です。

・ゲームを再生してキーボードの「スペースキー」を押してみましょう。

・スペースキーを押すたびにジャンプすれば成功です。


(3)Ballスクリプトを改良して「空中ジャンプ」を禁止する。

・現時点では空中でも無限にジャンプができる状態です。

「Ball」スクリプトを改良してこれを禁止しましょう。

「コードを確認」の中の「★★改良(空中ジャンプ禁止)」部分を追加してください。

・コードが書けたらチェック

 

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

public class Ball : MonoBehaviour
{
    public float moveSpeed;
    private Rigidbody rb;
    public AudioClip coinGet;
    public float jumpSpeed;

    // ★★改良(空中ジャンプ禁止)
    // boolは「真偽型」と呼ばれ「true」か「false」の2つの値を扱うことができます。
    private bool isJumping = false;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveH, 0, moveV);
        rb.AddForce(movement * moveSpeed);

        // ★★改良(空中ジャンプ禁止)
        // 「&&」は「包含関係の『かつ』の意味」
        // (例)「A && B」AかつB・・・>AとBの両方の条件が揃った時
        // 「==」は「左右が等しい」という意味
        if (Input.GetButtonDown("Jump") && isJumping == false)
        {
            rb.velocity = Vector3.up * jumpSpeed;

            // isJumpingという名前の箱の中身を「true」にする。
            isJumping = true;
        }
    }

・ゲームを再生してキーボードの「スペースキー」を押してみましょう。

・今度は「1回だけ」ジャンプができるようになっています。

・なぜ1回しかジャンプできないのか?その理由(仕組み)を考えてみましょう。

 


(4)Ballスクリプトを改良して「ジャンプを復活」させる。

・床に触れたらジャンプが復活するようにしてみましょう。

「コードを確認」の中の「★★★改良(ジャンプの復活)」部分を追加してください。

・コードが書けたらチェック

 

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

public class Ball : MonoBehaviour
{
    public float moveSpeed;
    private Rigidbody rb;
    public AudioClip coinGet;
    public float jumpSpeed;
    private bool isJumping = false;

    void Start()
    {
        rb = GetComponent<Rigidbody>();   
    }
    
    void Update()
    {
        float moveH = Input.GetAxis("Horizontal");
        float moveV = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveH, 0, moveV);
        rb.AddForce(movement * moveSpeed);

        if (Input.GetButtonDown("Jump") && isJumping == false)
        {
            rb.velocity = Vector3.up * jumpSpeed;
            isJumping = true;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Coin"))
        {
            Destroy(other.gameObject);
            AudioSource.PlayClipAtPoint(coinGet, transform.position);
        }
    }

    // ★★★改良(ジャンプの復活)
    // OnCollisionEnterのスペルに注意
    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.CompareTag("Floor"))
        {
            isJumping = false;
        }
    }
}

(5)Tagを設定する。

床にFloorというTagを設定しましょう。

(ポイント)OnCollisionEnterの場合には「Is Trigger」のチェックは不要です。

 

・これで全ての準備が完了です。再生してキーボードの「スペースキー」を押してみましょう。

・空中ではジャンプができませんが、床に触れるとジャンプが復活すれば成功です。

・なぜジャンプが復活するのか?その理由(仕組み)を考えてみましょう。