Unity:Rigidbodyコンポーネントを制御してキーの押し時間でジャンプ力を調整する

今回はRigidbodyコンポーネントアタッチしたオブジェクトのジャンプ力をキーの押し時間で調整する方法を試してみました。

Rigidbody コンポーネントに力を加える方法

今回はRigidbody コンポーネントに AddForce を使用してジャンプさせることにしました。なお、 Rigidbody.velocity – Unity スクリプトリファレンス では、速度ベクトル変数の velocity を値を使用してジャンプさせるサンプルコードが書かれています。注意点として下記のように解説されています。

ほとんどの場合、ベロシティを直接変更しないでください。現実的ではない動作になる可能性があります。物理ステップごとにオブジェクトの速度を設定しないでください。これは非現実的な物理シミュレーションにつながります。一般的な使い方は、一人称視点のシューティングゲームでジャンプするときに速度を変更する場合です。速度を即座に変更する必要があるためです。

キー入力の制御

キー入力の処理方法から Input.GetKey() と Input.GetKeyDown() の違いを確認してみました。公式スクリプトリファレンスには下記のように解説されています。英文だったのでGoogle翻訳しました。

Input.GetKey()
Input.GetKey – Unity スクリプトリファレンス
識別されたキーを押している間、true を返します。これは自動発射のために使用することができます。

Input.GetKeyDown()
Input.GetKeyDown – Unityスクリプトトリファレンス
状態は各フレームでリセットされるため、Update関数からこの関数を呼び出す必要があります。ユーザーがキーを離してもう一度押すまで true は返されません。

シーンの作成

テスト用のオブジェクト Sphere をシーンに配置。床として Standard Assets > Prototyping > Prefabs > FloorPrototype64x01x64 を配置しました。

オブジェクト Sphere には Rigidbod コンポーネントをアタッチ。

入力を切り替えるための UI Toggle オブジェクトを追加して完成。[Hierarchy]ウィンドウはこのような構成になっています。

[Game]ビューで見るとこのような感じ。

スクリプト の作成

というわけで、キー入力処理の Input.GetKey() と Input.GetKeyDown() を比較できるように UI Toggle コンポーネントを使用して切り替える処理を加えてこのようなコードになりました。

キー入力処理の Input.GetKey() の処理では Rigidbodに力が継続して加わるためにジャンプ力を調整する変数 jumpPower の値を弱くしています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// UI 関連クラスを使用する宣言
using UnityEngine.UI;

public class JpmpScript : MonoBehaviour
{
    // Rigidbod コンポーネントを格納する変数
    public Rigidbody rb;
    // ジャンプ力:Rigidbod コンポーネントに加える力を格納する変数
    private float jumpPower;
    // ジャンプ:KeyCode を格納する変数
    public KeyCode key;
    // UI Toggle コンポーネントを格納する変数
    public Toggle toggle;
    // UI Text コンポーネントを格納する変数
    public Text toggleLabel;
    // ジャンプ有効フラグ
    private bool jump;

    // ゲーム開始時の処理
    void Start()
    {
        // 関数 ToggleChange() を実行
        ToggleChange();
    }

    // ゲーム実行中に一定タイミングで実行される処理
    private void FixedUpdate()
    {
        // ジャンプ有効フラグが true の場合
        if (jump)
        {
            // Rigidbod コンポーネントに力を加える
            //  ForceMode.Impulse で瞬時に衝撃力を適用
            rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
            // ジャンプ有効フラグを false に設定
            jump = false;
        }
    }

    // ゲーム実行中に毎フレーム実行される処理
    void Update()
    {
        // オブジェクトのジャンプ高さの抑制
        // Rigidbod コンポーネントのY座標が 1.2f 以下であれば
        if (rb.position.y < 1.2f)
        {
            // 変数 key に格納したキーを押し続けている間、
            // かつUI Toggle コンポーネントの isOn が false であれば
            // または
            // 変数 key に格納したキー入力があれば、
            // かつUI Toggle コンポーネントの isOn が true であれば
            if ((Input.GetKey(key) && !toggle.isOn) || (Input.GetKeyDown(key) && toggle.isOn))
            {
                // ジャンプ有効フラグを true に設定
                jump = true;
            }
        }
    }

    // UI Toggle コンポーネントの 値が変更された場合に実行する処理
    public void ToggleChange()
    {
        // UI Toggle コンポーネントの isOn が false であれば
        if (!toggle.isOn)
        {
            // Text コンポーネントの text に "GetKey" を格納
            toggleLabel.text = "GetKey:キー押時間でジャンプ力調整";
            // ジャンプ力の変数 jumpPower に 1f を入力
            jumpPower = 1f;
        }
        // UI Toggle コンポーネントの isOn が true であれば
        if (toggle.isOn)
        {
            // Text コンポーネントの text に "GetKeyDown" を格納
            toggleLabel.text = "GetKeyDown:ジャンプ力一定";
            // ジャンプ力の変数 jumpPower に 8f を入力
            jumpPower = 8f;
        }
    }
}

スクリプトコンポーネントの設定

保存したスクリプト JpmpScript を[Hierarchy]ウィンドウ > Canvas にアタッチします。[Inspector]ウィンドウで見るとこのようになっています。

スクリプト JpmpScript (Script) コンポーネントの変数フィールドに必要な設定を行います。

  • Rb:オブジェクト Sphere を割り当て
  • Key:ジャンプボタンを割り当て
  • Toggle:UI Toggle ボタンを割り当て
  • Toggle Label:UI Toggle ボタンの階層にある Label テキストオブジェクトを割り当て

EventSystem の設定

UI Toggle のオン・オフが Space キーに反応するので EventSystem の設定を変更します。[Hierarchy]ウィンドウ > EventSystem を選択。[Inspector]ウィンドウ > EventSystem (Script) コンポーネント > Send Navigation Event のチェックを外します。

WebGL

今回の内容をWebGLでビルドしてみました。画像クリックでファイルがダウンロード、再生されます。 Space キーでジャンプします。(ダウンロードサイズ:約8MB)

スポンサーリンク
スポンサーリンク

スポンサーリンク

フォローする