【Unity】Rigidbodyを使用して重力・空気抵抗を発生させる方法


今回はUnityのRigidbodyを使用して重力を発生させる方法をご紹介します。

本記事でご紹介する内容は以下の通りです。

  • 重力を発生させる方法(Rigidbodyの追加方法)
  • Rigidbodyの基本的な使い方
  • 重力の大きさの変更方法
  • 空気抵抗を発生させる方法

以上をご紹介していきます。

Unityの基本的な使い方や情報を知りたいという方は以下の記事をご参考ください。

【入門】Unityを使ったゲーム開発ができるようになる!|Unityの基本スキルまとめ

重力を発生させる

重力を発生させる方法をご紹介します。

まずは適当にオブジェクトを生成しましょう。今回は例としてSphere(球体)を生成し、Sphereに重力を発生させます。

落下した際に落ち続けないようにするためにPlane(平面)も作成します。

まず以下赤枠のGameObject→3D Objecrt→Planeを選択してください。こちらは初期値のままで問題ありません。

平面作成

次に以下赤枠のGameObject→3D Object→Sphereを選択してください。

こちらは重力が発生したことがわかりやすくなるように、Inspector→Transform→PositionのYの値を3に変更しておきましょう。(高さは任意なので好きな高さにしていただいて問題ありません)

球体作成

ここまでの操作が問題なく進んでいれば以下のような状態になります。

球体平面設定完了

続いて重力(Rigidbody)を設定します。

先ほど作成したSphereをHierarchyビューで選択してください。

次に以下赤枠のInspectorビュー→Add Component→Physicsを選択してください。

physics設定

選択したら、以下赤枠のRigidbodyを選択してください。

Rigidbody設定

Inspectorビューに以下赤枠部分が追加されれば設定完了です。

Rigidbody設定完了

では実際に重力が発生しているのかを確認してみましょう。

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
・Discreteの場合はシーン内の他の全てのコライダーに対して離散コリジョン検出を使用する(デフォルト)
・Continuousの場合はダイナミックコライダー(剛体)と静的なMeshColliders(剛体でない場合)に対する連続的なコリジョン検出に対して、離散コリジョン検出を使用
・Continuous Dynamicの場合はContinuousおよびContinuousDynamicCollisionに設定されたオブジェクトに対して、連続的な衝突検出を使用
Freeze Position
・ワールド座標系のX,Y,Z軸で移動するRigidbodyを選択的に停止
Freeze Rotation
・ローカル座標系のX,Y,Z軸で回転するRigidbodyを選択的に停止

重力の大きさ変更

次に重力の大きさを変更する方法を確認します。

Rigidbodyの使い方でもご紹介した通り、重力の重さはMassによってKg単位で指定できます。

実際にどのように重さに違いが出ているのかを確認する実験をしてみましょう。

まずはじめに重さを比較できる装置を作成します。(シーソーのような装置)

以下のようなTransformの値をもつCubeを作成してください。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:デフォルト値

Heavy値

Sphere_rightの値を以下のように設定してください。

  • Position:X=-4、Y=4、Z=0
  • Rotation、Scale:デフォルト値

Right値

以上を問題なく設定できれば、以下のような状態になります。

Position設定完了

これで位置の設定は完了です。

次に重さを変更します。

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」に設定してください。

Heavy_Drag設定

続いてSphere_rightのDragの値を「0」に設定してください。(この値はデフォルトですので変更する必要はありません)

Right_Drag設定

以上で空気抵抗の設定は完了です。実際に動きの違いをみてみましょう。

空気抵抗比較

赤い球体が先ほど空気抵抗を「3」に設定した方です。このようにDragを大きくすることで空気抵抗が大きくなることがわかります。

まとめ

いかがでしたでしょうか。

UnityのRigidbodyを使用して重力や空気抵抗を設定する方法をご紹介しました。

非常に簡単に重力や空気抵抗を設定できることがわかると思います。

これ以外にもプログラムを使用して重力を発生させる方法なども存在しますが、まず簡単な機能の使用方法を覚えてから応用としてプログラムを覚えるのが良いかと思います。


Furui