君がゲームを作る!Unityゲーム開発入門
第27回 キャラクターをジャンプさせる(前編)

Update と FixedUpdate の使いわけに注目してね

こんにちは!

世間では今日、ソフトバンクとワイモバイルで大規模な通信障害があったそうですね。 その中には福岡も含まれているそうです。

ずっと家でWi-Fiな僕はとても疎外感を感じていますよあらたまです。

さて、今日はUnity入門の第27回目。今回はキャラクターをジャンプさせてみましょう!

おさらい

前回 では、キャラクターをスムーズに横移動操作できるようにしましたね。

今回は、スペースキーを押したらキャラクターがジャンプするようにしていきます。

スクリプトにジャンプ処理を追加

ジャンプそのものは、基本的には横移動と同じです。 スペースキーが押されたとき、上向きの力を加えます。

それではスクリプト(プログラム)にジャンプ処理を追加してみましょう!

プロジェクトウィンドウで「Scripts」フォルダから「CharaControl」ファイルを選択し、 インスペクターウィンドウで「Open」をクリックします。

スクリプトの編集画面(プログラミング画面)が表示されました。

現在のスクリプトの状態は、前回まででこのようになっていますね。
少し眺めて、以前に書いた内容を思い出しましょう。

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

public class CharaControl : MonoBehaviour {

    // キャラクターの移動スピード(インスペクターウィンドウで値を設定)
    public float speed;

    // Rigidbody2Dを保持するメンバ変数
    private Rigidbody2D rb2d;

    // コンポーネントの初期化処理
    void Start()
    {
        // ゲームオブジェクトが持っているRigidbody2Dコンポーネントを
        // 取得してメンバ変数に保持
        rb2d = GetComponent<Rigidbody2D>();
    }

    // 画面表示更新処理
    void FixedUpdate()
    {
        // 横矢印キーの押されている状況を取得
        float moveHorizontal = Input.GetAxis("Horizontal");

        // AddForceメソッドに渡すために、Vector2型に変換
        Vector2 movement = new Vector2(moveHorizontal, 0);

        // AddForceメソッドでキャラクターのRigidbody2Dコンポーネントに力を加える
        rb2d.AddForce(movement * speed);
    }
}

スクリプトの内容は思い出しましたか?

もしもちょっと内容を忘れちゃったな、、というひとは 第25回 を読み直して、思い出してみてくださいね。

ジャンプ処理を追加する

それでは、これにジャンプ処理を追加します。
太字の部分を追加してください。

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

public class CharaControl : MonoBehaviour {

    // キャラクターの移動スピード(インスペクターウィンドウで値を設定)
    public float speed;

    // Rigidbody2Dを保持するメンバ変数
    private Rigidbody2D rb2d;

    
    // ジャンプ力
    public float jumpForce;
    

    // コンポーネントの初期化処理
    void Start()
    {
        // ゲームオブジェクトが持っているRigidbody2Dコンポーネントを
        // 取得してメンバ変数に保持
        rb2d = GetComponent<Rigidbody2D>();
    }

    
    // 1フレーム毎に呼び出される
    private void Update()
    {
        // そのフレームでスペースキーが押されたか
        if (Input.GetKeyDown("space"))
        {
            // 上方向に力を加える
            rb2d.AddForce(Vector2.up * jumpForce);
        }
    }
    

    // 一定時間ごとに呼び出される
    void FixedUpdate()
    {
        // 横矢印キーの押されている状況を取得
        float moveHorizontal = Input.GetAxis("Horizontal");

        // AddForceメソッドに渡すために、Vector2型に変換
        Vector2 movement = new Vector2(moveHorizontal, 0);

        // AddForceメソッドでキャラクターのRigidbody2Dコンポーネントに力を加える
        rb2d.AddForce(movement * speed);
    }
}

jumpForce

メンバ変数のjumpForceはジャンプ力を保持します。
ここに入る値は、インスペクタビューで入力してジャンプ力を調整します。

Update

Updateメソッドは、1フレーム(画面の表示が更新されるタイミング)ごとに Unityから呼び出されるメソッドです。

すぐ下に名前が似ている「FixedUpdateメソッド」がありますね。 こちらは一定時間間隔ごとUnityから呼び出されるメソッドでしたね。

なぜUpdateメソッドを使っているの?その答えはすぐ下に書いてあります↓

Input.GetKeyDown("space")

そのフレームでスペースキーが押されていたらtrueを返す命令です。

「そのフレーム」でというところがポイントです。
「FixedUpdateメソッド」ではフレームとは関係なく一定間隔で呼び出されるので、 フレームとタイミングがずれるとキーが押されたことを見逃してしまいます。

そのため今回ジャンプ処理はUpdateメソッドに書いているのですね。

ジャンプ力を設定する

これでジャンプ処理をスクリプトに追加することができました!
インスペクターウィンドウでジャンプ力に350を設定しましょう。

テストプレイで動作確認をする

それでは、テストプレイをして変化を確認してみましょう!

▶ボタンを押して、プレイモードに入ります。

スペースキーを押すと、ジャンプすることができました!

。。が、スペースキーを連続して押すと、空中でも多段ジャンプができてしまいますね。。

忍者らしいといえば忍者らしいですが、 どこまでもジャンプできてしまうので直したほうがよさそうですね。

今回はここまでです!

次回はキャラクターが「Groundレイヤー」に接触しているときだけ、 ジャンプできるように手を加えたいと思います!

次回へ続く。

>> 続きの記事
【君がゲームを作る!Unityゲーム開発入門】第28回 キャラクターをジャンプさせる(後編)