【Unity】RigidbodyのAngularDrag(回転の抵抗)を変えて実験

【Unity】RigidbodyのAngularDrag(回転の抵抗)を変えて実験

Rigidbodyの中で、物体の回転に対する抵抗を設定できるのがAngularDrag

今回はそのAngularDragの値を変化させて運動への影響を確認します。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

4月末にUnity2018が出てたので早速使ってみました。

Rigidbodyについて

Rigidbodyのアタッチ方法や各設定項目の説明は、以下の記事で解説しています。

ざっくり言うと、Unityで物理演算を使うために必要なコンポーネントです。

今回はその中でもAngularDrag(回転の抵抗)がテーマ。

Rigidbodyのパラメータ
Rigidbodyのパラメータ

 

AngularDrag(回転の抵抗)について

Angularは「角度に関する」といった意味、Dragは「抵抗」とか、「引きずる」といった意味の言葉。Unity的には、回転に対する抵抗として使われます。

Angularの付いていないDragの方は、位置の変動に関する運動に対しての抵抗でした。AngularDragは、位置の変動にはノータッチだけども回転に関して抵抗を定義します。

くるくる回っているオブジェクトの回転が、だんだんと緩やかになるイメージです。

値を大きくすればするほど、減衰が大きくなります。設定値は無限大まで入力できますが、無限大にしたからといってすぐ止まるわけではありません。

すんごい細かい話ですが、Unityのマニュアルのプロパティ説明で項目名が『LinearDrag』になっています。実際の設定はAngularDragが正しいので、初見ではビビるかも。

ボールが転がる時の抵抗

物理特性マテリアルを使うと摩擦力を設定できますが、地面の上をボールが転がるときには摩擦力が働いてくれません。接してる面が小さすぎるからでしょうか。

なので、ボールの回転を減衰させることで、擬似的に摩擦力っぽい表現ができます。

用意したボールは以下の6種類。

  • angularDrag : 0
  • angularDrag : 0.5
  • angularDrag : 1
  • angularDrag : 2
  • angularDrag : 5
  • angularDrag : 10

angularDrag以外の値はRigidbodyをアタッチした時のデフォルトのものになっています。massはみんな1で、dragは0です。

質量や抵抗の時と同じように、ボタンを押すと全てのボールに同じ力が加わり、運動を開始するシーンを作って比較してみました。

ForceModeはImpulseとし、加えた力の大きさは画面左上に表示しています。

転がるボールのAngularDrag
転がるボールのAngularDrag

 

物理特性マテリアルによる摩擦力が働いてくれないSphereオブジェクトでも、angularDragによって回転を減衰させ、運動を停止させることができました。

値が小さければ止まりにくくなり、大きければ止まりやすくなります。angularDragが0だと止まらずにそのまま転がっていきます。

 

斜方投射の時のangularDrag

斜方投射のケースも見てみましょ。

AddForceで力を加えるときには、回転は付与されません。なので、斜方投射ではボールが地面に接触するまで減衰がないことに。

地面に接触するまではangularDragの値によらず横並び、接触後はangularDragの値に応じて減衰するはず。

斜方投射のAngularDrag
斜方投射のAngularDrag

 

うんうん、いい感じいい感じ。

転がってからの減衰は、上記の転がる時の動きと同じになってます。

トルクの減衰

angularDragの本領といえば回転の減衰。

今度は、立方体に回転を与え、その回転がangularDragによってどの程度減衰するのか見てみましょ。

回転を与える方法としてRigidbodyのAddTorqueを使います。AddForceと似ていて、こちらはトルクを加えるメソッド。

トルクは回転軸の周りにおける力のモーメントです。Unity的には、物体を回転させる力の大きさと向き、と考えておけばいいかな。

トルクが大きければよく回転しますし、トルクが小さければ回転も小さくなります。

今回は細かい話は抜きにして、とにかく立方体を回転させ、angularDragによって減衰する様子を眺めてみましょ。

回転の減衰
回転の減衰

 

……GIFがちょっと汚くなってますね。回転によって光の当たり方が変わり、それに伴って色も変化するため色数が足りなくなってます。

さて本題ですが、この例では質量を揃えてあるので、angularDragのみ影響するようになっています。回転の抵抗がなければangularDrag : 0のように回転するはず。

そんな中、値が大きいオブジェクトほどすぐに回転が止まっています。angularDrag : 10とか即停止レベル。

angularDragの影響は結構大きいですね。

上記のように、空中にあるオブジェクトを回転させ、angularDragによって減衰させる例を考えてみると、アクションゲームの中間ポイントの演出などに使えそう。

キャラクターがオブジェクトに触れたらAddTorqueで回転させて、angularDragによって自動的に停止させる感じで。

メインのオブジェクトに使うよりは、背景のオブジェクトに使うのがいいかな。

背景なら風力発電してる感じを出してもいいかも。一定時間おきにランダムでトルクを加えていけば、背景で風が吹いたような演出も可能です。

まとめ

RigidbodyのangularDragを変化させる実験でした。

回転に対する抵抗なので、オブジェクトが回転していない時には関係のない値です。dragは位置の移動に関する抵抗、angularDragは回転に対する抵抗と、使い分けが大事ですね。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!