Unityで間違った重力の計算をしているかも!?

今回は、今まで何となく使っていた重力の計算を考えてみようと思います。

物理の計算とか考えるだけでも疲れてしまいますが・・・、重力値の加味に関してあいまいに使っていたので、検証して正しく使ってみる事にします。

スポンサーリンク

今までの重力計算が正しいか検証する

まずは今までやってきていた重力値の計算が正しく出来ているのかどうかを検証してみます。

重力値の計算はCharacterControllerでキャラクターを動かしている場合は自分で計算しなければいけません。
この自分で計算という部分で間違いが混入してしまいがちです。

Rigidbodyを使ってキャラクターを動かしている場合はRigidbodyのインスペクタでUse Gravityにチェックを入れるだけで、キャラクターに勝手に重力を加味してくれます。

という事で、ヒエラルキー上に二つの3DオブジェクトのCubeを作成し、

スクリプトから重力値を計算するCubeをScriptCube
Rigidbodyの自動重力計算機能を使うCubeをRigidCube

という名前をつけます。

rigidbody1

上のようになります。

ScriptCubeがRigidbodyCubeと同じように落下すれば正しくスクリプトが組めているという事になります。

rigidbody2

ScriptCubeには上のようにGravityという新しいスクリプトとCharacterControllerコンポーネントを追加します。
Gravityスクリプトは後で作成します。

rigidbody3

RigidCubeにはRigidbodyコンポーネントを付け、Use Gravityにチェックを入れます。
今回は落下だけを計算するので、回転や横への移動などはさせないようチェックを入れます。
わかりやすいようにScriptCubeの色を赤色、RigidCubeの色を青色にしました。

今までの間違っていた重力計算スクリプト

ScriptCubeに設定するGravityスクリプトを作成します。

間違い処理

上のUpdate関数内の処理がわたくしがよくやっていた処理です。

Updateが呼び出される度に移動距離をリセットし、そこに重力値(Physics.gravity.y)を足して最後にTime.deltaTimeをかけて1秒間の速さを計算しCharacterControllerの機能を使って移動させます。

Unityの実行ボタンを押して試してみます。

rigidbody4

青色のRigidbodyに比べ赤色のスクリプトで計算した重力の方はやたら落ちてくるのが遅いです。
そもそも重力値(Physics.gravity.y)に1秒間辺りのTime.deltaTimeをかけていないのでおかしい事になっているんですが・・・、ただでさえ落ちるのが遅いのにTime.deltaTimeをかけたらさらに遅くなります。

混乱してきました。(^_^;)
そもそも重力はどうやって計算してるのか?という所を考えなきゃいけません。

そもそも重力はどうやって計算するのか?

落下速度=重力加速度 * 秒

なのでCharacterControllerのMoveの引数に渡す速さの所に落下速度を加えなければいけません。

Physics.gravity.y * Time.deltaTime

は1秒当たりの重力の値を入れていますが、velocityをVector3.zeroで毎回0に初期化していると、
重力加速度を表す事が出来ません。

重力加速度は1秒で約9.8m、2秒だと19.6mとなっているので、Updateが呼ばれるごとに足していかなければいけない事に気がつきます。
ということは今までの重力の計算は完全に間違っていました!(+_+)

重力を正しく計算したスクリプト

ということで、Updateでyの値を初期化せず、Physics.gravity.yにTime.deltaTimeをかけた処理に変更します。

正しい処理

それでは確認してみます。

rigidbody5

上のように重力がかかるタイミングが違うので多少ズレていますが、同じ速さで移動しているのがわかります。

重力について

検証してわかった事ですが、今までの重力の計算をしていた処理が全部間違っていました。(^_^;)
移動速度ではなく距離と考えてスクリプトを組んでいたのがそもそも間違っていたのかも。

んー、しかしあんまりよく理解は出来ていない気がします。

とりあえず重力を計算していた個所を少しづつ直していかないといけなくなりました・・・・(+_+)

今回は重力加速度が9.8↓にかかるという風に現実的な重力で計算していますが、ゲームに合わせて重力値を変えたり、そもそも重力を使わないという選択肢もあります。

Physics.gravity.yを使わなくても数値として-3.0fの重力加速度を加えたりしてもいいわけです。

ゲームに合わせて変更してください。