【Unity】AddForceで力を加える時のモードを変えて動きを観察

【Unity】AddForceで力を加える時のモードを変えて動きを観察

Rigidbodyといえば、Unityユーザーで使ったことがない人がいないレベルでよく使われるコンポーネント。

このRigidbodyはUnityに物理演算をしてもらうために使いますが、スクリプトからAddForceメソッドだったり、AddTorqueメソッドだったりを使って、力やトルクを加えることができます。

これらのメソッドを使う際に、力の加え方を指定することができますが、それぞれどんな動きをするのかなーというのを観察します。

4つのモードがあるので、使い分けについても。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

力のモード・ForceMode

「AddForceを使うぜ!」なんて時に、ひとくちに力の加え方なんて言っても、色々なやり方があるんです。

例えば、一瞬だけ力を加えてあとは物理法則に任せたり、ずっと力を加え続けたり。

Unityではこのような力の加え方を以下の4通りの方法で指定することができます。

  • Force
  • Acceleration
  • Impulse
  • VelocityChange

名前だけ見てもピンとこないかも。ポイントは、力を継続的に加えるかどうか、質量を使うかどうかです。

詳細な説明はUnityのスクリプトリファレンスをご覧いただくとして、ここではざっくり説明。

また、日本語の情報として分かりやすかったのがエフアンダーバーさんの以下の記事です。こちらはRigidbody全般の話がメインですが、ForceModeの解説もされています。

Force

Rigidbodyで設定された質量を考慮して、継続的に力を与え続けるモードです。

方向キーを押しっぱなしにしている間は力を加え続ける、なんて時に便利。

重いオブジェクトは動きにくく、逆に軽いオブジェクトは簡単に飛んでいきます。

AddForceの第2引数で指定しなかった場合は、このモードがデフォルト値として使われます。

Acceleration

Rigidbodyで設定された質量を考慮しないで、継続的に力を与えるモードです。

使い方はForceと似ていますが、こちらは質量関係なく力を与え続けたい時に。

キャラクターを動かす時に、質量に応じたジャンプ力ではなく、一定のジャンプ力にしたいならこっち。

Impulse

Rigidbodyで設定された質量を考慮して、瞬間的に力を与えるモードです。

VelocityChangeと似ていますが、質量を考慮しているので動き出し方に差が出ます。

このブログで扱っている初心者向けチュートリアルでも、斜方投射で投射する時にForceMode.Impulseを使っています。

VelocityChange

Rigidbodyで設定された質量を考慮しないで、瞬間的に力を与え続けるモードです。

力を与えるというよりは、一瞬で速度変化させているイメージが近いかも。

ゲーム的な操作だと質量を無視した方が動かしやすいかもしれません。

表にまとめると

4つのモードの特徴を表にすると以下のようになります。

モード 質量 力が与えられるタイミング
考慮する 無視する 継続的 ドカンと一発
Force
Acceleration
Impulse
VelocityChange

表現したいものに合わせて選ぶのは大事ですが、迷ったらデフォルトのForceを使っておけばいいかも。ザ・力って感じで分かりやすいですし。

 

動きの比較

質量の異なるRigidbodyを4種類用意しました。手前からそれぞれMassの値を0.5, 1, 2, 5としています。

ボールに加わる力の大きさは画面左上に Forceとして表示、その下にForce Modeの現在値を表示しています。

画面右下にあるボタンは、『GO!!』が1フレームだけ力を加えるボタン、『Adding』がボタンを押している間力を加え続けるボタンになっています。

実験に使うRigidbody
実験に使うRigidbody

 

この条件で動きを確認したものが以下の導かれしGIFたちです。

ForceMode.Force

力を一回だけ加えるとこんな感じ。手前にいるボールは微妙に進んでいます。

ForceMode.Forceで一回だけ
ForceMode.Forceで一回だけ

 

続けて、力を与え続けた場合。徐々に加速し、手前のボールは空に飛んで行きました。

ForceMode.Forceで力を与え続ける
ForceMode.Forceで力を与え続ける

 

ForceMode.Acceleration

継続的に力を加える点はForceと同じですが、こちらは質量に関係なく同じ動きをするようになっています。

ForceMode.Forceでは白いボールぐらいしか動いていませんでしたが、黒いボールも白いボールと同じように動いています。画面奥だからちょっと見にくいかも。

ForceMode.Accelerationで一回だけ
ForceMode.Accelerationで一回だけ

 

質量に関係なく力が加わる点はこちらのGIFの方が分かりやすいですね。毎フレーム力を加え続けていくと、どのボールも同じように運動します。

画面では分かりにくいですが、若干空中を飛んでいます。

ForceMode.Accelerationで力を与え続ける
ForceMode.Accelerationで力を与え続ける

 

ForceMode.Impulse

上の二つとは違い、瞬間的に力を加えるモードだと、1フレームだけでも十分な力を与えられます。

物理の斜方投射なんかはこのモードで力を加えるとちょうどいいです。

ForceMode.Impulseで一回だけ
ForceMode.Impulseで一回だけ

 

1フレーム分の力だけで十分なのに、今度は力を加え続けてみました。質量に応じて飛び方は変わってきますが、毎フレーム大きな力を与えられているのですぐにぶっ飛びます。

ForceMode.Impulseで力を与え続ける
ForceMode.Impulseで力を与え続ける

 

ForceMode.VelocityChange

瞬間的に力を加える点ではImpulseと同じです。まずは1フレームだけ力を加えると以下のような感じに。質量を無視するため、どのボールも同じ運動の仕方になってます。

ForceMode.VelocityChangeで一回だけ
ForceMode.VelocityChangeで一回だけ

 

毎フレーム力を加えたらこうなります。どのボールも簡単に飛んでいきます。

ForceMode.VelocityChangeで力を与え続ける
ForceMode.VelocityChangeで力を与え続ける

 

まとめ

ForceModeの違いに応じた運動の変化を観察しました。

使い分けのポイントは、力が加わるのは継続的か、瞬間的か。質量を考慮するか、無視するか。の2点。

AddForceしたい対象に合わせてうまく選べると吉。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?