今回はRigidbodyコンポーネントアタッチしたオブジェクトのジャンプ力をキーの押し時間で調整する方法を試してみました。
Rigidbody コンポーネントに力を加える方法
今回はRigidbody コンポーネントに AddForce を使用してジャンプさせることにしました。なお、 Rigidbody.velocity – Unity スクリプトリファレンス では、速度ベクトル変数の velocity を値を使用してジャンプさせるサンプルコードが書かれています。注意点として下記のように解説されています。
キー入力の制御
キー入力の処理方法から Input.GetKey() と Input.GetKeyDown() の違いを確認してみました。公式スクリプトリファレンスには下記のように解説されています。英文だったのでGoogle翻訳しました。
Input.GetKey – Unity スクリプトリファレンス
識別されたキーを押している間、true を返します。これは自動発射のために使用することができます。
Input.GetKeyDown()
Input.GetKeyDown – Unityスクリプトトリファレンス
状態は各フレームでリセットされるため、Update関数からこの関数を呼び出す必要があります。ユーザーがキーを離してもう一度押すまで true は返されません。
シーンの作成
テスト用のオブジェクト Sphere をシーンに配置。床として Standard Assets > Prototyping > Prefabs > FloorPrototype64x01x64 を配置しました。

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

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

スクリプト の作成
というわけで、キー入力処理の 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)