Unityにおいて物理シミュレーションを実現するためには、Rigidbody(リジッドボディ)を利用することがあります。
オブジェクトに追加することで物理的な挙動を与えることができます。
本記事では、そんなRigidbodyについて解説していきます。
また、Unityについてより詳しく知りたいという方は、弊社過去の記事をご覧ください。
目次
|Rigidbodyとは
Rigidbody(リジッドボディ)は、Unityの物理エンジンにおいて、オブジェクトに物理的な動きを与えるためのコンポーネントの一つです。
Rigidbodyがアタッチされたオブジェクトは、重力や力を加えることによって物理的に動作するようになります。
具体的には、衝突や重力、回転、移動、反発などが自然にシミュレーションされます。
Rigidbodyを利用することで、リアルな動きやインタラクションを実現することができます。
RigidbodyをUnity Documentationから簡単にまとめると、
・重力やその他の力に影響を受けるようできる
・Colliderに対して衝突判定が実行される
つまり、Rigidbodyを追加することで、物理演算を簡単に行うことができます。
|Rigidbodyの項目
Rigidbodyは、Unityにおける物理演算を扱うコンポーネントであり、オブジェクトに物理的な動きを与えることができます。
Rigidbodyを使用することで、重力や衝突、回転、移動などが自然にシミュレーションされ、よりリアルな世界を構築することができます。
ここでは、Rigidbodyの項目について解説していきます。
Mass
UnityにおけるMassは質量にあたります。
質量の単位は、現実世界と同じく「キログラム(kg)」です。
Massの値が「1」であれば、オブジェクトの質量は「1キログラム」になります。
Drag
Dragは、オブジェクトが力によって動く際に、空気抵抗の大きさを調整することで制御できるパラメータです。
Dragの値が小さいと空気抵抗も小さくなります。
オブジェクトは自由に移動する。
Dragを大きくすると、オブジェクトは空気抵抗によって強く抑えられ、動きを止めることができます。
Angular Drag
AngularDragは、オブジェクトの回転による抵抗を表します。
回転を始めた時点で減衰が始まり、値を大きくすると地面を転がっているような摩擦力が働いているように表現できます。
また、物理特性マテリアルではボールなどに思ったように摩擦力が働きません。
Angular Dragを大きめに設定することが有効です。
Use Gravity
UseGravityはRigidbodyが重力を制御する項目で、初期値ではtrueに設定されています。
重力はPhysicsManagerで定義されており、初期値では-9.81のY軸方向に力が加わります。
PhysicsManagerは、Project Settings > Physicsから開くことができますので、確認してみるとよいでしょう。
Is Kinematic
Is Kinematicは、物理演算の影響の有無を設定できます。
物理演算を利用するためにRigidbodyを追加しますが、isKinematicを有効にすると、力やコリジョン、ジョイントなどはRigidbodyに影響を与えなくなります。
代わりに、アニメーションやスクリプトによってオブジェクトを制御できます。
また、Kinematicなオブジェクトは、他のRigidbodyに影響を与えることもできます。
Interpolate
Interpolateは、物理演算によって動くオブジェクトを滑らかに描画するための機能です。
物理演算と描画のタイミングが異なるため、前後のフレームを補間して、オブジェクトの動きをスムーズに表現する必要があります。
このため、Interpolateを利用することで、補間処理を行うことができます。
Interpolateは、以下の3つの設定があります。
None:補間が行われず、描画が痙攣するような見た目になります。デフォルトで選択されています。
Interpolate: 前フレームと現在のフレームの間で補間が行われ、描画が滑らかになります。
補間には、前フレームのオブジェクトの速度を利用して、現在のオブジェクトの位置を計算する方法が使われます。
これは、過去の動きに基づいて現在の位置を算出する方法であり、設定名と内容が同じで混乱しやすいかもしれません。
Extrapolate:補間が行われますが、次のフレームでの位置をスムーズに動かすために、現在のオブジェクトの速度から未来の位置を推定します。
スクリプトリファレンスによると、InterpolateはExtrapolateよりも反応が遅れる場合があるとされています。
ただし、Interpolateの方が計算コストが高く、Extrapolateの方が安いとされています。
ただし、Extrapolateは現在の速度から未来の位置を予測するため、不自然に描画される危険性があるので注意が必要です。
Interpolateを使うことで、物理演算と描画のタイミングのズレを補間処理によって滑らかにすることができるでしょう。
Collision Detection
「Collision Detection」には、「Discrete」、「Continuous」、「Continuous Dynamic(」の3つの方法があります。
Discrete:FixedUpdateが呼ばれた時に衝突を検知するため、その時にColliderが重なっていなければ衝突と見なされず、高速で移動しているときにオブジェクトを通り抜ける可能性がある。
パフォーマンスは良いですが、衝突を検知できない場合があります。
Continuous:Rigidbodyを持たずColliderを持つオブジェクトとの衝突を継続的に検知する機能で、衝突の精度は「Discrete」よりも高いですが、処理が重くなります。
Continuous Dynamic:RigidbodyとColliderを持つオブジェクトのCollision Detectionが「Continuous」または「Continuous Dynamic」であれば、継続的に衝突を検知します。
動いている軌道まで計算するため、パフォーマンスは低下しますが、精度は高いです。
高速で動くオブジェクトに対してのみ利用するのが適切です。
Constraints
ConstraintsはUnityで位置や回転に制約をかけるための機能です。以下のような項目があります。
Freeze Position:選択した軸でオブジェクトの動きを停止します。
Freeze Rotation:選択した軸でオブジェクトの回転を停止します。
|Rigidbodyで重力を発生させる方法
では、実際にRigidbodyを利用して重力を発生させてみましょう。
チュートリアルなので、簡単なものを作っていきます。
0.事前準備
まず、Rigidbodyの追加対象となるオブジェクトを作成します。
Hierarchy上を右クリック > 3DObject > Sphere で、Sphereが新規作成できます。
HierarchyのSphereをクリック > InspectorのPositionを(0,0,0)にし、カメラから見える位置にSphereを調節しましょう。
1.Rigidbodyを設定する
次にSphereを選択した状態でInspectorを見てください。
下の方の「Add Componet」をクリックし、検索ウィンドウに「Rigidbody」と入力してください。そこで「Rigidbody」が出てきたら選択します。
すると、インスペクタの下のほうにRigidbodyが追加されます。これで、SphereにRigidbodyを追加することができました。
このように、Add Componetでオブジェクトに機能を追加することができます。
2.重力が発生しているか確認する
では、実際にSphereに重力が加わっているか確認してみましょう。
Unityの画面の中央上にある再生ボタンを選択しましょう。
※Ctrl + p でショートカットキーでシーンを再生できます。
ここまでの手順が上手く進んでいれば、Sphereが落下します。
SphereにRigidbodyを追加したことで落下させることができたということです。
設定方法の解説は以上となります。
|まとめ
この記事ではRigidbodyの基本的な使い方について解説しました。
Rigidbodyは、Unityにおいて物理演算をしたい時に必須となるコンポーネントです。
パラメータにはイメージしやすいものもあれば、イメージしにくいものもあります。
興味がある方は、UnityでRigidbodyを実際に実際に触って勉強してみるのが一番いいでしょう。ぜひ試してみて下さいね。