チャムコード

チャーさんのUnityゲームラボです。Unityでゲーム制作する時に使うコードやノウハウをメインに発信しています。Unityでゲーム制作したいと思っているなら読んでください。

ゲーム開発ノウハウ

Unityでジャンプする方法(空中ジャンプ防止機能付き)

投稿日:2023年12月29日 更新日:

どうも、チャーさんです。

 

あなたはUnityでジャンプ機能を作りたい

と思っていますか?この記事では、パソコンの

キーボードを押したら、ジャンプする機能の作り方を説明します。

 

なのであなたがこの記事を読めば、

オブジェクトであれ、キャラクターであれスペースキーを

押したらジャンプさせるというのができますよ。

 

 

しかしこの記事を読まなければ、おかしいジャンプになったり、

ワープしたりそもそもジャンプできなかったり

 

色々求めてるジャンプにならなくて困るかも

ですので、そうなりたくなければ読んでください。

動画はこちら

 

Unityでジャンプさせる方法

 

ということで早速説明していきます。

Unityで自然なジャンプ機能を作るには、

 

RIgidbodyのvelocityを使えばできます。

 

 

velocityでジャンプできる理由

 

理由はRigidbodyのvelocityを使うことで

物理が計算された自然なジャンプになり、

transformとかのワープする様な動きにならないからです。

 

ということであなたがUnityでジャンプ機能を作りたい

ならRigidbodyのvelocityでジャンプさせましょう。

 

 

velocityってなんなん?

 

でここであなたはふと思うかもしれません。

「Rigidbodyはなんとなく知ってるけど、

velocityって何やねん」、と。

 

ということでvelocityについてなるべく簡単に

深追いしない様に話します。

 

まずvelocityとは、速度のことでして、Unity内では

平たくオブジェクトの移動速度だと思ってください。

 

 

つまりvelocity(オブジェクトの移動速度)が

0ならオブジェクトはその場で全く動かないですし、

 

velocity(オブジェクトの移動速度)が10なら

1秒間あたり10m(unity内での単位で)

オブジェクトが動く(移動する)ってことです。

 

 

ということで、UnityではRigidbodyのvelocityとは

移動速度を表す数値であり、

 

肝心なことは、このvelocityを使えばオブジェクトを

動かすことができます。

 

 

動かせる方向はx軸、y軸、z軸、どの方向にでも動かせます。

ということでy軸、つまり上に移動させればジャンプです。

 

なので、物理の効いた自然なジャンプができます。

これ以上はジャンプには関係なくなる知識かと思うので

ということでここからは、手順を書いていきます。

 

Unityでジャンプ機能の実装手順

 

1Rigidbodyつける

2スクリプト貼り付ける

3ジャンプのコードを書く

 

です。

 

というわけで順番に説明します。

 

1、Rigidbodyつける

 

今までの説明からRigidbodyのvelocityで

ジャンプさせるのでRigidbodyをつけましょう。

 

なので、あなたがジャンプをさせたい

と思ってるオブジェクトや、キャラクターオブジェクト

にRigidbodyコンポーネントをつけてください。

 

 

2、スクリプトつける

 

でつけ終わったら、次は、スクリプトを貼り付けましょう

同じ様にAdd Componentボタン押して、

検索窓にnewと打ち込んだら

 

new scriptというのがあるのでそれを選び、

jumpとでも名前をつけてスクリプトコンポーネントを

そのオブジェクトにつけてください。

 

3、コードを書く

 

でそれが終わったらコードです。

コードは以下の様に書きましょう。

 

Unityジャンプ用のスクリプト

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class スクリプト名 : MonoBehaviour
{
private bool isJumping;
Rigidbody rb ;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        isJumping = false;
    }
 
    // Update is called once per frame
    void FixedUpdate()
    {
        if(Input.GetKeyDown(KeyCode.Space)){
        if(isJumping == false){
        rb.velocity = new Vector3(0,10,0);
       
        }
        isJumping = true;
        }
 
 
    }
 
    void OnCollisionEnter(Collision col){
    if(col.gameObject.tag == “ground”){
    isJumping = false;
    }
    }
}

 

上記のコードはキーボードのスペースキーを押すと

ジャンプします。

 

かつ二段ジャンプ不可能なコードです。

着地判定をしてるので、地面となるオブジェクト

(planeとか)には、

 

groundというタグ名を新規で追加して

地面になるオブジェクトにつけましょう。

 

 

ということでここからはコードの説明をします。

まずジャンプに関わる記述だけを抜粋しますと、

以下です。

 

Rigidbody rb ;

void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
 
void FixedUpdate()
    {
        if(Input.GetKeyDown(KeyCode.Space)){
          rb.velocity = new Vector3(0,10,0);
       }
     }

 

です。

 

記述を言葉に変えるとやってることとしては、

・Rigidbody用の変数を宣言

・Rigidbodyコンポーネントの取得

・スペースキーを押したらジャンプする

 

というものです。

 

 

Rigidbodyはスクリプトで操作する際

取得する必要があるので変数宣言、取得してまして

 

で今日の本題であるジャンプ用のRigidbodyのvelocityは

rb.velocity = new Vector3(0,10,0);

という書き方をします。

 

new vector3(x軸,y軸,z軸)なので、

上記の様に書くことでy軸方向、

つまり上にジャンプします。

 

 

またRigidbodyを使うのでUpdate関数を

FixedUpdateに書き変えます。

 

 

で、この以下の

if(Input.GetKeyDown(KeyCode.Space)){
          rb.velocity = new Vector3(0,10,0);
       }

 

ですがif文のとこはパソコンキーボードの

スペースキーを押したらという意味でして、

押したらvelocityが動いてジャンプするって記述です。

 

 

ということで、一旦あなたの方でもスクリプトに

説明した記述を書き加えて試してみましょう。

 

で、ゲーム再生状態にしてスペースキーを押して

ジャンプできればちゃんと書けてます。

 

ジャンプの高さを変える方法

 

ちなみにジャンプの高さは、この

rb.velocity = new Vector3(0,10,0);

の部分で変えれます。

 

上記では、new vector3の()内のy軸が10になってますが、

ここを5とかにすればジャンプの時の高さが低くなりますし、

数字を増やすとより高くジャンプする様になります。

 

コードとして紹介してないですが、

この数字部分を変数にしてインスペクターから編集

できる様にすればジャンプの高さを簡単に操作できますね。

 

 

空中ジャンプ、二段ジャンプ防止のコード

 

で、ここからは二段ジャンプを防ぐコード部分です。

 

キーとなるのは、

bool型のisJumpingという変数と、

着地判定の部分です。

 

やってることとしては、スペースキーを押して

ジャンプしたら、isJumpingという変数をtrueに

します。

 

 

そしてisJumpingがtrueになってる間は

スペースキーを押してもジャンプできないと

いう様にします。

 

ですがずっとそのままでは困るので地面に着地

したらisJumpingをfalseに戻します。

するとまたジャンプできる様になります。

 

コード的には、isJumpingの部分が以下でして、

最初にbool型で変数宣言し、ゲームスタートと同時に

falseをセットします。

 

 

private bool isJumping;

void Start()
{

isJumping = false;
}

 

そして、

 

if(Input.GetKeyDown(KeyCode.Space)){
if(isJumping == false){
rb.velocity = new Vector3(0,10,0);

}
isJumping = true;
}

 

でスペースキーを押した時に、isJumpingがfalse

であれば、ジャンプし、同時にisJumpingを

trueにするというコードを書くことで

 

再度スペースキーを押しても、

isJumpingがtrueになってるので、

ジャンプできないわけです。

 

 

で地面に着地したらtrueをfalseにする

部分が、以下でして、

 

void OnCollisionEnter(Collision col){
 if(col.gameObject.tag == “ground”){
  isJumping = false;
 }
}

 

上記のコードによって、groundというタグを設定

した地面用のオブジェクトに触れたら、

isJumpingがfalseになります。

 

 

タグを設定してるのは、これを設定しないと

どんなオブジェクトにプレイヤーオブジェクトが

接触してもisJumpingが解除されてしまうからです。

 

なのでfalseをセットするのをgroundという

タグがついたオブジェクトに限定することで、

二段ジャンプ防止が意図しないことで解除されるのを

 

防ぐという感じです。

 

 

なので上記のコードを書いたら、

あなたが地面として使うオブジェクトにはタグを

設定しておきましょう。

 

 

ということでこれでジャンプもできて

空中ジャンプ防止の機能ができました。

 

ということであなたの方でもコード書いたら、

一度ゲーム再生ボタンを押し、

スペースキーを押してみましょう。

 

 

ジャンプできましたか?空中で再度押しても

空中ジャンプしないですか?

 

そうであれば成功です。

 

まとめ

 

ということでまとめです。

Unityでジャンプさせるには、

以下をやりましょう。

 

Rigidbodyのvelocityでジャンプさせる。

で手順としては、

 

1Rigidbodyつける

2スクリプト貼り付ける

3ジャンプのコードを書く

 

ですね。

コードは記事中程を参照してください。

 

 

ということでUnityでジャンプさせる方法でした。

読んでいただきありがとうございました。

 

それでわ。

チャーさん

 
 
 

 

 

 

-ゲーム開発ノウハウ

関連記事

Unityで動く床(滑らない、往復)の作り方はコチラ

どうも、チャーさんです。 あなたはUnityで動く床、それも滑り落ちず 往復するやつを作りたいと思っていますか?   この記事を読めばそれは実現します。 ですが読まないと結構つまづきます。 …

Unityでのゲームオーバー機能の作り方をわかりやすく説明

  どうも、チャーさんです。 この記事では、Unityでゲームオーバー画面の 作り方を説明します。   この記事を読めば、あなたはゲームオーバー画面を作れて さらにゲームオーバーの …

no image

unityでターン制のゲームを作るにはコレを使いましょう

どうも、チャーさんです。 あなたはunityでターン制ゲームを作りたい そう思っていませんか?   この記事ではunityでターン制のゲームを 作る方法を書いています。   なので …

UnityでHPを回復させる機能を作る方法(簡単なやり方です)

どうも、チャーさんです。 この記事では、UnityでHPを回復させる方法を お話しします。   ゲームでは基本プレイヤーが回復することが多い のでプレイヤーのHPの回復方法を書きます。 &n …

no image

unityでキー入力で攻撃する方法(3分以内にできます)

どうも、チャーさんです。 あなたはunityでキー入力による攻撃を したいですか?   この記事ではunityでキー入力で攻撃を する方法を書いてますので、あなたがこれを読めば、 キー入力で …

Unityでオブジェクトを上下移動(往復)させる機能の作り方

どうも、チャーさんです。 あなたはUnityでオブジェクトを自動で上下移動させたい と思っていますか?   オブジェクトを上下に自動で往復させたり、 動く床として上下に自動で往復させたり、 …

最新記事

チャーさん

Unityに関する記事を書いてます。

 

[簡単な経歴]

 

2018年-プログラムを始めUnityの存在を知りハマる。

2019年-エンジニアとして仕事開始(web系)

2021年-UnityでVR開発等にも手を出し始める。

現在-エンジニアとして活動しながらUnityも続行中。

 

youtubeでは、Unityに関する動画をあげてるので、

あなたのUnityスキルアップにどうぞ。