【unity入門】Rigitbody2DのBody Typeについて

2019年4月9日

RigidbodyコンポーネントにはBodyTypeという項目があります。

この記事ではBodyTypeについて解説します。

BodyTypeとは

そもそもBodyTypeとは何かというと、簡単に言えばRigidbody2Dの状態のことです。

種類は3種類あり、

1.Dynamic
2.Kinematic
3.Static


です。

BodyTypeはInspectorから変更することができます。

それではそれぞれのモードについて紹介していこうと思います。

Dynamic

モードがDynamicの時はオブジェクトに物理演算が適応されます。

Rigidbodyを適応した最初の状態ですね。

スクリプトでDynamicにする

Dynamicにするには

Rigidbody2D.bodyType = RigidbodyType2D.Dynamic;

サンプルコードは、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    void Start()
    {
        //Rigidbody2Dを取得
        var rb = GetComponent<Rigidbody2D>();

        //Dynamicにする
        rb.bodyType = RigidbodyType2D.Dynamic;
    }
}

Dynamicの挙動

Dynamicは普通に物理現象が適応されますので、重力によって落下していきます。

Kinematic

kinematicモードは重力や力が適応されません。

kinematicモードを動かしたい場合、スクリプトで位置を指定することで移動させます。

スクリプトでkinematicにする

kinematicにするには

Rigidbody2D.bodyType = RigidbodyType2D.kinematic;

サンプルコードは、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    void Start()
    {
        //Rigidbody2Dを取得
        var rb = GetComponent<Rigidbody2D>();

        //kinematicにする
        rb.bodyType = RigidbodyType2D.Kinematic;
    }
}

Kinematicの挙動(重力)

Kinematicでは重力が適応されません。

ですのでオブジェクトに重力が適応されないので、起動時は宙に浮かんだままです。

kinematicの挙動(力)

また、外的な力が加わってもピクリともしません。

またスクリプトで力を加えても動きません。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    //変数を作る
    Rigidbody2D rb;

    void Start()
    {
        //Rigidbody2Dを取得
        rb = GetComponent<Rigidbody2D>();

        //加える力
        Vector2 force = new Vector2(1000, 0);

        //Rigidbody2Dに力を加える
        rb.AddForce(force);
    }



上記のスクリプトをdynamicとkinematicモードのオブジェクトに適応した時の挙動です。

上側のdynamicモードのオブジェクトは起動と同時に右側に力が適応されていますが、下側のkinematicモードのオブジェクトは全く力が適応されていません

kinematicの移動

kinematicモードのオブジェクトを移動させるにはMovePosition関数を使います。

使い方は、

rigidbody2D.MovePosition(vector2型の変数)

サンプルコードは、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    //変数を作る
    Rigidbody2D rb;
    Vector2 pos;

    void Start()
    {
        //Rigidbody2Dを取得
        rb = GetComponent<Rigidbody2D>();

        //移動場所
        pos = new Vector2(5, 0);

        //移動させる
        rb.MovePosition(pos);
    }
}

実行結果は、

kinematicの回転

kinematicモードのオブジェクトを回転させるにはMovePosition関数を使います。

使い方は、

rigidbody2D.MoveRotation(float型);

サンプルコードは、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    //変数を作る
    Rigidbody2D rb;

    void Start()
    {
        //Rigidbody2Dを取得
        rb = GetComponent<Rigidbody2D>();

        //45度回転させる
        rb.MoveRotation(45.0f);
    }
}

実行結果は、

Static

Staticは全く動くことがないオブジェクトです。

これだけだとkinematicと同じように感じるかと思いますが違いはもちろんあります

主な違いとしては、

1.移動や回転ができない
2.処理が軽い


といったことでしょう。

スクリプトでStaticにする

Staticにするには

Rigidbody2D.bodyType = RigidbodyType2D.Static;

サンプルコードは、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    void Start()
    {
        //Rigidbody2Dを取得
        var rb = GetComponent<Rigidbody2D>();

        //Staticにする
        rb.bodyType = RigidbodyType2D.Static;
    }
}

移動や回転ができない

kinematicはMovePositionやMoveRotation関数を使えばスクリプトで移動や回転をすることができました。

しかし、StaticではMovePositionやMoveRotation関数を使うことができません

試しに先ほどkinematicのところで使った、スタートと同時に回転するスクリプトを適応させてみましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    //変数を作る
    Rigidbody2D rb;

    void Start()
    {
        //Rigidbody2Dを取得
        rb = GetComponent<Rigidbody2D>();

        //45度回転させる
        rb.MoveRotation(45.0f);
    }

}

実行結果は、

やっぱり動きません!

処理が軽い

Staticがkinematicと異なる点としては処理が軽いことも挙げられます。

一つ一つの差としては大したことはないですが、Rigidbody2Dを追加したオブジェクトを大量に使う場合はStaticを使っておくと幸せになれるのではないでしょうか!

まとめ

今回はRigidbody2DのBody Typeについてまとめました。

この記事を読んでBody Typeについての理解が少しでも深まったのなら幸いです!