RigidbodyのBodyTypeの違いを見てみる【Unityメモ】

今回はRigidBody2Dの「BodyType」の違いのメモです。

RigidBodyのBodyType

RigidBody2Dコンポーネントの1番上にあるBodyTypeの項目には、「Dynamic(動的)」、「Kinematic」、「Static(静的)」の3種類があります。

ボディタイプを変更すると、設定できるコンポーネントが変わります。

具体的な違い

実際にどう違うのかを具体的に見ていきます。

まずは「2Dオブジェクト」→「スプライト」→「円」を追加。

Rigidbody2Dをアタッチします。

Dynamic(動的)

初期値のDynamicの状態で動かしてみると、下に落ちていきます。

Dynamic(動的)では、質量、重力スケールが初期値で設定されているので、その影響で下に落ちています。

Dynamicは移動する物体として、一般的なボディタイプなのでデフォルトです。プロパティも多いため、3種類の中で一番パフォーマンスに高い負荷がかかります。

Movingと言う名前でスクリプトをアタッチ。

下に落ちないように重力スケールを0にします。

スクリプトの中身を下記にして、力を加えてみます。

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

public class Moving : MonoBehaviour
{
    private Vector2 _move;
    private float _force = 3.0f;
    private Rigidbody2D _rb;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        _move = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
        _rb.AddForce(_move * _force);
    }
}

キー入力でボールに力が加わったような自然な動きをします。

キネマティック

ボディタイプをキネマティックに変更するとプロパティが減り、重力と力の影響をうけなくなります。

この場合の物体を動かす方法は「速度(力の影響受けない)」か「再配置」。

下記が速度で動かす場合のスクリプト例

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

public class Moving : MonoBehaviour
{
    private Rigidbody2D _rb;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();

        Vector2 v = new Vector2(1, 0);
        _rb.velocity = v;
    }
}

下記が再配置(ポジション移動)の例。

Invoke(再帰)で少しづつ動かしています。一気に移動する場合、いきなりMovePositionの指定でOK。

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

public class Moving : MonoBehaviour
{
    private Rigidbody2D _rb;
    private Vector2 _pos;
    private float _Xpos;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
        movePosition();
    }

    private void movePosition()
    {
        if (_Xpos <= 8.0)
        {
            _Xpos += 0.02f;
            _pos = new Vector2(_Xpos, 0);
            _rb.MovePosition(_pos);
            Invoke("movePosition", 0.01f);
        }
    }
}

質量に関係するプロパティがないため、無限に大きな質量があるかのように動作します。

プロパティが減るため、dynamicよりもシステムリソースに負荷をかけないです。

Static(静的)

全く動かないのがStaticです。

ためしに、MovePositionで動かそうとするとエラーが出ます。

特徴としては、全く動かない、もっともリソースに負荷がかからない。と言った感じ。

タイトルとURLをコピーしました