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 の値を弱くしています。

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

保存したスクリプト 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)