【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』がボタンを押している間力を加え続けるボタンになっています。
この条件で動きを確認したものが以下の導かれしGIFたちです。
ForceMode.Force
力を一回だけ加えるとこんな感じ。手前にいるボールは微妙に進んでいます。
続けて、力を与え続けた場合。徐々に加速し、手前のボールは空に飛んで行きました。
ForceMode.Acceleration
継続的に力を加える点はForceと同じですが、こちらは質量に関係なく同じ動きをするようになっています。
ForceMode.Forceでは白いボールぐらいしか動いていませんでしたが、黒いボールも白いボールと同じように動いています。画面奥だからちょっと見にくいかも。
質量に関係なく力が加わる点はこちらのGIFの方が分かりやすいですね。毎フレーム力を加え続けていくと、どのボールも同じように運動します。
画面では分かりにくいですが、若干空中を飛んでいます。
ForceMode.Impulse
上の二つとは違い、瞬間的に力を加えるモードだと、1フレームだけでも十分な力を与えられます。
物理の斜方投射なんかはこのモードで力を加えるとちょうどいいです。
1フレーム分の力だけで十分なのに、今度は力を加え続けてみました。質量に応じて飛び方は変わってきますが、毎フレーム大きな力を与えられているのですぐにぶっ飛びます。
ForceMode.VelocityChange
瞬間的に力を加える点ではImpulseと同じです。まずは1フレームだけ力を加えると以下のような感じに。質量を無視するため、どのボールも同じ運動の仕方になってます。
毎フレーム力を加えたらこうなります。どのボールも簡単に飛んでいきます。
まとめ
ForceModeの違いに応じた運動の変化を観察しました。
使い分けのポイントは、力が加わるのは継続的か、瞬間的か。質量を考慮するか、無視するか。の2点。
AddForceしたい対象に合わせてうまく選べると吉。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】物理特性マテリアルを使って摩擦を表現する実験 2018.05.31
-
次の記事
【Unity】AddComponentMenuでスクリプトを整理して表示 2018.06.05
todo様からの実験による具体的な観察結果、詳しく書いて頂いて、ありがとうございました。
それより一歩先に、
Force modeの本質については:
https://answers.unity.com/questions/696068/difference-between-forcemodeforceaccelerationimpul.html
にあります。
皆さんのご参考にしてください
コメントと情報ありがとうございます!