【Unity】Rigidbodyを使用して重力・空気抵抗を発生させる方法
今回はUnityのRigidbodyを使用して重力を発生させる方法をご紹介します。
本記事でご紹介する内容は以下の通りです。
- 重力を発生させる方法(Rigidbodyの追加方法)
- Rigidbodyの基本的な使い方
- 重力の大きさの変更方法
- 空気抵抗を発生させる方法
以上をご紹介していきます。
Unityの基本的な使い方や情報を知りたいという方は以下の記事をご参考ください。
重力を発生させる
重力を発生させる方法をご紹介します。
まずは適当にオブジェクトを生成しましょう。今回は例としてSphere(球体)を生成し、Sphereに重力を発生させます。
落下した際に落ち続けないようにするためにPlane(平面)も作成します。
まず以下赤枠のGameObject→3D Objecrt→Planeを選択してください。こちらは初期値のままで問題ありません。
次に以下赤枠のGameObject→3D Object→Sphereを選択してください。
こちらは重力が発生したことがわかりやすくなるように、Inspector→Transform→PositionのYの値を3に変更しておきましょう。(高さは任意なので好きな高さにしていただいて問題ありません)
ここまでの操作が問題なく進んでいれば以下のような状態になります。
続いて重力(Rigidbody)を設定します。
先ほど作成したSphereをHierarchyビューで選択してください。
次に以下赤枠のInspectorビュー→Add Component→Physicsを選択してください。
選択したら、以下赤枠のRigidbodyを選択してください。
Inspectorビューに以下赤枠部分が追加されれば設定完了です。
では実際に重力が発生しているのかを確認してみましょう。
Playボタン(再生ボタン)を選択してください。以下のように動作すれば問題ありません。
これで簡単な重力の発生が完了しました。
Rigidbodyの使い方
次にRigidbodyの基本的な使い方についてご紹介します。
各プロパティの使い方について以下の表でご紹介します。
Mass |
・物体の質量(単位:Kg)
|
Drag |
・力による空気抵抗の大きさ
|
Angular Drag |
・トルクによる空気抵抗の大きさ
|
Use Gravity |
・ONにすると重力が発生
|
Is Kinematic |
・ONにすると重力が発生しなくなるが、Transformでのみ操作が可能
|
Interpolate
|
・Noneの場合は補完を適用しない
|
・Interpolateの場合は前フレームのTransformに基づくTransformによってのみ操作が可能
|
|
・Extrapolateの場合は次フレームのTransformを予測してTransformにスムージングを行う
|
|
Collision Detection
|
|
・Continuousの場合はダイナミックコライダー(剛体)と静的なMeshColliders(剛体でない場合)に対する連続的なコリジョン検出に対して、離散コリジョン検出を使用
|
|
・Continuous Dynamicの場合はContinuousおよびContinuousDynamicCollisionに設定されたオブジェクトに対して、連続的な衝突検出を使用
|
|
Freeze Position |
・ワールド座標系のX,Y,Z軸で移動するRigidbodyを選択的に停止
|
Freeze Rotation |
・ローカル座標系のX,Y,Z軸で回転するRigidbodyを選択的に停止
|
重力の大きさ変更
次に重力の大きさを変更する方法を確認します。
Rigidbodyの使い方でもご紹介した通り、重力の重さはMassによってKg単位で指定できます。
実際にどのように重さに違いが出ているのかを確認する実験をしてみましょう。
まずはじめに重さを比較できる装置を作成します。(シーソーのような装置)
以下のようなTransformの値をもつCubeを作成してください。Cubeの作成方法はここでは省略します。
次に以下のようなTransformの値をもつCubeを作成してください。
以上で作成したCubeそれぞれに重力(Rigidbody)を設定してください。重力の詳細情報はデフォルト値で問題ありません。
Rigidbodyを設定しないと、シーソーに球体が当たった時に反応しなくなってしまいます。
ここまで問題なく作成できていれば以下のような状態になります。
(わかりやすくするために色を設定しています)
次に大きさを比較するためにSphereを複製します。
はじめに作成したSphereを右クリックしてCopyを選択してください。
次にHierarchyビューを右クリックしてPasteを選択してください。名前を変更していなければ「Sphere(1)」が複製されます。
ここからの操作は重さ比較をわかりやすくするための操作です。
もともとあったSphereの名前を「Sphere_heavy」、複製したSphereの名前を「Sphere_right」にしてください。
また、それぞれがわかりやすいように色付けしておくと良いです。(今回はSphere_heavyが赤、Sphere_rightが青に設定してあります)
それぞれの位置を変更します。
Sphere_heavyの値を以下のように設定してください。
- Position:X=4、Y=4、Z=0
- Rotation、Scale:デフォルト値
Sphere_rightの値を以下のように設定してください。
- Position:X=-4、Y=4、Z=0
- Rotation、Scale:デフォルト値
以上を問題なく設定できれば、以下のような状態になります。
これで位置の設定は完了です。
次に重さを変更します。
Sphere_rightの重さはそのままで、Sphere_heavyの重さを変更します。
Sphere_heavyを選択して以下赤枠のInspectorビュー→Rigidbody→Massの値を「10」に変更してください。
これが適切な重さに設定されていれば、10kgの球体(赤)と1kg(青)の球体の重さが比較されて、軽い方の球体が飛ばされるはずです。
では実際にPlayボタン(再生ボタン)を押して比較してみましょう。
以上のようにSphere_right(青)がSphere_heavy(赤)よりも重いことがわかります。
この際、球体がシーソーに張り付いてしまうというエラーが発生する場合は、先ほど作成したシーソー(Cube)部分にRigidbodyを追加していない可能性がありますのでご確認ください。
以上で重さ比較は終了です。
空気抵抗を発生させる
続いて空気抵抗の発生方法をご紹介します。
先ほど作成したシーソー部分は削除してください。
次に先ほど作成した二つのSphereのMassの大きさを「1」に統一してください。
これで前処理は終了です。
空気抵抗はRigidbodyの使い方でもご紹介した通り、Dragの値を変更することで設定することが可能です。
ここでは一つの球体の空気抵抗を「0」、もう一つを「3」にして比較してみましょう。
まずはじめに以下のようにSphere_heavyのDragの値を「3」に設定してください。
続いてSphere_rightのDragの値を「0」に設定してください。(この値はデフォルトですので変更する必要はありません)
以上で空気抵抗の設定は完了です。実際に動きの違いをみてみましょう。
赤い球体が先ほど空気抵抗を「3」に設定した方です。このようにDragを大きくすることで空気抵抗が大きくなることがわかります。
まとめ
いかがでしたでしょうか。
UnityのRigidbodyを使用して重力や空気抵抗を設定する方法をご紹介しました。
非常に簡単に重力や空気抵抗を設定できることがわかると思います。
これ以外にもプログラムを使用して重力を発生させる方法なども存在しますが、まず簡単な機能の使用方法を覚えてから応用としてプログラムを覚えるのが良いかと思います。
重力の停止方法や跳ね返りの実装方法など、物理演算に関する記事もあるので、ご興味ある方はご一読ください。
参考記事)【Unity】物理演算を徹底解説!物理演算の停止・精度変更・水や髪の物理演算まで
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!