regidbodyを利用した移動時にどんな方法を使っていますか?
その一つにあげられるのが、velocityを利用した移動方法だと思います。
しかしvelocityを移動に使うことは基本的に推奨されていません。
今回はその辺りに触れてvelocityとは一体何なのかを見つつ、では実際どんな時にvelocityを使うのかまで見てきましょう。
[基本] 使うとどんな動きをするの?
[応用] 現在の速度表示に使える!
[応用] 最高速度の制限に!
[応用] FPSゲームのジャンプにもよく使われる!
では今回もよろしくお願いいたします。
まずvelocityとは?
velocityを一言で言うと「速度ベクトル」です。
Vector3型で「現在の速度ベクトル」を保持してくれています。
(Vector3に詳しくない人はこちらの記事を確認しておきましょう!)
もちろん上書きすれば、現在の速度ベクトルを変更することもできます。
それを利用して、移動に使うことも出来るわけですね!
とはいえ先ほども説明したように、velocityを利用した移動はあまり推奨されていません。
公式リファレンスにもvelocityの項目に、以下のように記載があります。
「ほとんどの場合、非現実的な挙動になるため速度を直接修正するべきではありません。」
これは「質量や重力などを考慮せずに、突然速度が変化する」なんて状況は物理演算をする上で不自然な挙動につながるからです。
同じ力を与えても、軽いものは素早く加速し、重い物ゆっくり加速していくべきですよね!
質量などを考慮して、移動を行いたい場合は、velocityではなくAddForceなどを利用すると良いでしょう。
AddForceについて学びたい場合はこちらの記事をご覧ください。
使うとどんな動きをするの?
AddForceを利用した移動を行うと、質量などを考慮した移動ができます。
velocityを利用した移動を行うと、物理演算を考慮せず速度を無理やり書き換えることとなります。
せっかくなので、実際にAddForceとvelocityでの移動を比較してみてみましょう。
AddForceを利用した移動
velocityを利用した移動
AddForceの質量感のある動きにくらべ、velocityの加速は質量が感じられないと思います。
もちろん作る作品の上で、違和感がないのなら使用しても問題ありません。
例えばゲームを作る際、演出上オブジェクトを現実離れした挙動をさせることなんて多々ありますしね!
良い作品を作るためには、絶対に物理演算を守る必要はなく、面白く見せることが大事です。
とは物理演算をつかうのなら、基本的には質量などを考慮したAddForceを使用した動きをさせることが好ましいのも事実です。
AddForceとvelocityどちらで動かすべきか悩んでいる人は、AddForceもきっちり勉強してその上で選んでいきましょう。
現在の速度表示に使える!
velocityは、Vector3型で速度ベクトルを保持しているのは先ほど説明しました。
つまりVector3のmagnitude関数を使用すれば、ベクトルの力(速度)が取得できます。
magnitude関数は、ベクトルの長さを取得出来る関数なんです。
以下は速度を取得して、ログに表示する例です。
void Update () { // Rigidbody取得 Rigidbody rb = this.transform.GetComponent<Rigidbody> (); // 現在の速度をログに表示 Debug.Log (rb.velocity.magnitude); }
今回はログに速度を表示しているだけですが、Textなどで表示すれば例えばレースゲームなどでは利用価値があるでしょう。
Textについて知りたい人はこちらの記事をご覧ください!
最高速度の制限に!
速度が取れるということは、速度制限をつけることが可能ですね!
void FixedUpdate () { Rigidbody rb = this.transform.GetComponent<Rigidbody> (); Vector3 force = new Vector3 (30.0f, 0.0f, 0.0f); // 速度が10以下なら力を加える if (rb.velocity.magnitude < 10.0f) { rb.AddForce (force); // 力を加える } }
上記は単純な速度制限設定ですが、一定の速度が出たら、力を加えないようにしています。
速度が取れれば、こういった速度での判定も行えますね!
FPSゲームのジャンプにもよく使われる!
こちらは公式のリファレンスに乗っている使用例です。
void FixedUpdate() { if (Input.GetButtonDown("Jump")) { Rigidbody rb = this.transform.GetComponent<Rigidbody> (); rb.velocity = new Vector3(0, 10, 0); } }
ジャンプボタンが押された際に速度を加えています。
たしかにFPSのジャンプは、膝を曲げてジャンプする真面目な物理演算というよりは、ポーンと軽く飛ぶようなそんな挙動な気もします。(もちろん作品にもよりますが…)
基本的に推奨していないとはいえど、あまり気にせず、違和感がないのなら有効活用していきましょう。
何事も、絶対こうしなければならないというルールはありません。
物を作る上では、面白くユーザーにストレスを与えない挙動が最優先です。
まとめ
いかがでしたでしょうか。
この辺りが物理演算を使った基本的な動きとなります。
とはいえ、これ以外にも力の加え方は多数存在します。
実現したいことが増えてきたら、また新しく学んでみましょう。