今回は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)