• トップ
  • ブログ一覧
  • 【Unity】Rigidbodyの基本
  • 【Unity】Rigidbodyの基本

    広告メディア事業部広告メディア事業部
    2021.01.05

    エンジニアになろう!

    オブジェクトをリアリスティックに動かそう!

    ゲーム内のオブジェクトやキャラクターを、現実の世界のように動かしたい!

    そんな時に便利なのが「Rigidbody」。

    Rigidbody とは、オブジェクトを物理特性によって制御するための機能です。

    例えば、「手に持ったリンゴを放したら落ちる」のが当たり前ですよね?

    このように、オブジェクトの動作をより自然にしてくれるのです。

    今回は、「Rigidbody」の基本について解説していきます!

    Rigidbody を追加

    まずは、オブジェクトに Rigidbody コンポーネントを付けていきましょう。

    地面とボールを作る

    最初に、地面を作ります。

    Hierarcy 上で右クリックし、「3D Object」から「Plane」を選択します。

    Hierarcy 上で右クリックし、「3D Object」から「Plane」を選択

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

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

    位置は好みで構いませんが、ここでは「Position(0,4,0)」とします。

    Rigidbody をつける

    次に、Rigidbody コンポーネントをボールオブジェクトに付け加えます。

    Sphere を選択した状態で AddComponent をクリックし、「Rigidbody」を検索・選択しましょう。

    3D ゲームを作る場合、Rigidbody 2D を選択しないように注意してください。

    Sphere を選択した状態で AddComponent をクリックし、「Rigidbody」を検索・選択

    これで、ボールに物理的特性が加わりました。

    試しに実行してみると、ボールが重力の影響を受け、地面まで落下するはずです。

    プロパティーを確認

    さて、Rigidbody コンポーネントを見てみると、いくつかのプロパティーが並んでいますね。

    ここでは、よく利用する基本的な部分を解説していきます。

    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」という名前にしておきましょう。

    対象のオブジェクト上で右クリックし、「Create Empty」を選択

    Empty Object を移動させる

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

    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 に割り当てます。

    スクリプトを対象のオブジェクトにアタッチしたら、CenterOfMass を myCennterOfMass に割り当て

    これで、重心の位置が変更されました!

    重力の変更

    最後に、重力の向きと大きさを変更しましょう。

    デフォルトでは、Y 軸方向に「−9.81」の重力がかけられています。

    画面上方の Edit から ProjectSetting を選択し、Physics を選択します。

    画面上方の Edit から ProjectSetting を選択し、Physics を選択

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

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

    さいごに

    Rigidbody を使えば、簡単にリアリスティックな動作を実装できます。

    「ピンボール」のようなシンプルなゲームなら、基礎的なテクニックだけですぐに作れちゃいますよ!

    この機会に、ぜひ Rigidbody をマスターしてみるのはいかがでしょうか?

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事