
【Unity】Rigidbodyの基本

エンジニアになろう!

オブジェクトをリアリスティックに動かそう!
ゲーム内のオブジェクトやキャラクターを、現実の世界のように動かしたい!
そんな時に便利なのが「Rigidbody」。
Rigidbody とは、オブジェクトを物理特性によって制御するための機能です。
例えば、「手に持ったリンゴを放したら落ちる」のが当たり前ですよね?
このように、オブジェクトの動作をより自然にしてくれるのです。
今回は、「Rigidbody」の基本について解説していきます!
Rigidbody を追加
まずは、オブジェクトに Rigidbody コンポーネントを付けていきましょう。
地面とボールを作る
最初に、地面を作ります。
Hierarcy 上で右クリックし、「3D Object」から「Plane」を選択します。

同様にしてボールを作り、地面の上方に配置します。

位置は好みで構いませんが、ここでは「Position(0,4,0)」とします。
Rigidbody をつける
次に、Rigidbody コンポーネントをボールオブジェクトに付け加えます。
Sphere を選択した状態で AddComponent をクリックし、「Rigidbody」を検索・選択しましょう。
3D ゲームを作る場合、Rigidbody 2D を選択しないように注意してください。

これで、ボールに物理的特性が加わりました。
試しに実行してみると、ボールが重力の影響を受け、地面まで落下するはずです。
プロパティーを確認
さて、Rigidbody コンポーネントを見てみると、いくつかのプロパティーが並んでいますね。
ここでは、よく利用する基本的な部分を解説していきます。

Mass | 物体の質量(Kg) |
Drag | 空気抵抗 |
Angular Drag | 回転抵抗 |
Use Gravity | 重力機能の有無 |
Is Kinematic | 物理的挙動の有無 |
Constraints | 位置と回転の固定 |
こんな時に使うと便利
Is Kinematic の使いどころ
当たり判定などで Rigidbody コンポーネントは必要だけど、重力や衝突の影響を受けてオブジェクトが動くのは困るといった時に便利です。
また、スクリプトから、動的に物理的挙動の有無を切り替えたい場合にも役立ちます。
Constrains の使いどころ
例えば、Freeze Position の x にチェックを入れた場合、オブジェクトは力によって x 方向に動くことがなくなります。
ただし、Freez Position は「ワールド座標」の軸、Freez Rotation は「ローカル座標」の軸による動きの制限である点に注意してください。
AddForce() の使い方
次は、「Rigibody.AddForce()」を使って、スクリプトからオブジェクトに力を加えてみましょう。
関数のパラメーター
1AddForce(Vector3 force, ForceMode mode);
force
第1引数の force には「力のベクトル」が入ります。
どの方向に、どれくらいの力を加えるのか、ワールド座標におけるベクトルで与えます。
mode
第2引数には「力のタイプ」が入ります。
Force(デフォルト) | 継続的な力 | 質量使用 |
Impulse | 瞬間的な力 | 質量使用 |
Acceleration | 継続的な加速 | 質量無視 |
VelocityChange | 瞬間的な加速 | 質量無視 |
スクリプトの書き方
それでは、実際にスクリプトを書いていきましょう。
スペースボタンを押すと、ボールに上向きに力を加える仕様にしたいと思います。
コードは以下の通りです。
1using UnityEngine;
2
3public class ForceController : MonoBehaviour
4{
5 private Rigidbody ballRb;
6 private float power = 8.0f; //力の大きさを決める
7
8 void Start()
9 {
10 ballRb = gameObject.GetComponent<Rigidbody>(); //ボールのRigidBodyを取得
11 }
12
13 void Update()
14 {
15 if (Input.GetKeyDown(KeyCode.Space)) //スペースボタンの入力を取得
16 {
17 ballRb.AddForce(Vector3.up * power, ForceMode.Impulse); //ボールに力を加える
18 }
19 }
20}
あとは、作成したスクリプトをボールにアタッチすれば適用されます。
物体の重心を変える
Rigidbody を使えば、オブジェクトの重心を変えることもできます。
偏りのある回転をさせたり、オブジェクトのバランスをとる際に役立ちますよ。
EmptyObject で重心の位置を決める
重心を移動させたいオブジェクトの子オブジェクトに「EmptyObject」を作成します。
EmptyObject は、Transform コンポーネントのみを持ったオブジェクトです。
EmptyObject を作成する
対象のオブジェクト上で右クリックし、「Create Empty」を選択します。
分かりやすいように「CenterOfMass」という名前にしておきましょう。

Empty Object を移動させる
Empty Object を重心にしたい位置まで移動させれば OK です。

スクリプトで重心を変える
重心の位置を決めたら、次は実際に重心を移動させましょう。
コードは以下の通りです。
1using UnityEngine;
2
3public class ForceController : MonoBehaviour
4{
5 private Rigidbody cubeRb;
6 [SerializeField] Transform myCenterObMass; //新しい重心のTransform
7
8 void Start()
9 {
10 cubeRb = gameObject.GetComponent<Rigidbody>(); //ボールのRigidBodyを取得
11 }
12
13 void Update()
14 {
15 cubeRb.centerOfMass = myCenterObMass.position; //重心の位置を変更
16 }
17}
スクリプトを対象のオブジェクトにアタッチしたら、CenterOfMass を myCennterOfMass に割り当てます。

これで、重心の位置が変更されました!
重力の変更
最後に、重力の向きと大きさを変更しましょう。
デフォルトでは、Y 軸方向に「−9.81」の重力がかけられています。
画面上方の Edit から ProjectSetting を選択し、Physics を選択します。

あとは、Gravity の X, Y ,Z 各方向への重力を変更するだけです。

さいごに
Rigidbody を使えば、簡単にリアリスティックな動作を実装できます。
「ピンボール」のようなシンプルなゲームなら、基礎的なテクニックだけですぐに作れちゃいますよ!
この機会に、ぜひ Rigidbody をマスターしてみるのはいかがでしょうか?
こちらの記事もオススメ!
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ

「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit