【unity入門】Rigidbodyの各項目や移動、停止方法などまとめ

2019年4月14日


unityで物理現象を適応したい場合に使うRigidbody

今回はRigidbodyについてまとめてみました。

扱っている内容に関しては目次をご覧ください

そもそもRigidbodyとは

そもそもRigidbodyとは何かと言うと、オブジェクトに物理現象を適応させるコンポーネントのことです。

コンポーネントというのはRPGゲームでいうところの装備品みたいなもので、オブジェクトにコンポーネントを追加することで色々な機能を追加することができます。

Rigidbodyを移動させる

Rigidbodyが追加されたオブジェクトを移動させたい場合があるでしょう。

オブジェクトはAddForce関数を使えば簡単に移動させることができます。

オブジェクトを移動させてみたい場合はこちらの記事をどうぞ『AddForceを使ったRigidbodyの移動

Rigidbodyを停止させる

Rigidbodyを追加した移動や落下をしているオブジェクトを停止させることができます。

移動や落下をしているオブジェクトを停止させたい場合はこちらの記事をご覧ください『Rigidbodyを停止させる方法

Rigidbody2Dについて

3DオブジェクトではRigidbodyを使いますが、2D オブジェクトにはRigidbody2Dを使います。

RigidbodyとRigidbody2Dはだいたい同じなのですが、微妙に違う部分があります。

Rigidbody2Dの使い方など詳しいことを知りたい場合はこちらの記事をどうぞ『Rigidbody2Dの各項目や移動、摩擦、重力の変更などについてまとめてみた

Rigidbodyの各項目

Rigidbodyの各項目について簡単に説明していきます。

Mass

Mass質量を表しています。

値を変えることで、軽くしたり重くしたりすることができます。

Massの単位やスクリプトでの制御など詳しいことを知りたい方はこちらの記事をご覧ください『Rigidbody.mass(質量)についてのまとめ

Drag

Dragは空気抵抗を表しています。

Dragの値を大きくしていくとオブジェクトは動きにくくなっていきます。

Dragの値が0では、

空気抵抗がないので勢いよく落下していきますが、

Dragの値を10に変更すると、

空気抵抗があるので緩やかに落ちていきます。

Angular Drag

angular dragオブジェクトが回転する時の空気抵抗を表しています。

angular dragの値を大きくしていくとオブジェクトが回転しづらくなります。

スクリプトによる制御など、angular dragを詳しく知りたい方はこちらの記事をどうぞ『Rigidbodyのangular dragについてのまとめ

Use Gravity

Use Gravityにチェックを入れるとオブジェクトに重力が適応されます。

チェックを外すと重力が適応されなくなります。

Rigidbodyを追加した段階ではチェックが入っているので重力が適応された状態です。

Is Kinematic

Is Kinematicにチェックを入れると物理現象が適応されなくなります。

具体的には重力が適応されなくなったり、AddForce関数で力を加えることができなくなります。

is kinematicをスクリプトからオンにする方法や見当たらない場合の対処法を知りたい場合はこちらの記事をどうぞ『is kinematicをスクリプトからオンにする方法/見当たらない場合の対処法

Interpolate

Interpolateは画面がガタガタするときにどのようにガタつきを軽減させるかを設定します。

そもそもガタつく原因は、Rigidbodyによって付与された物理演算と画面描画タイミングがずれていることです。

ガタつきを軽減させるために、画面描画のタイミングで物理演算が行われていないならどのような物理演算が行われるのか予測して補います。

どのような方法で予測して補うのか設定するのがInterpolateです。

None

Noneモードでは予測して補いません

ですので、もしガタつきがあるのならそのままガタつきます。

Rigidbodyを追加したばかりではモードはNoneになっています。

Interpolate

Interpolateは前フレームでのオブジェクト位置にもとづいて物理演算の動作を予測し補います。

Extrapolate

Extrapolateは次フレームのオブジェクト位置にもとづいて物理演算の動作を予測し補います。

Collision Detection

Collision Detectionものすごい速さでオブジェクトが当たった時にすり抜けるか設定することができます。

Discreteモードではすり抜け、ContinuousモードではぶつかるオブジェクトがRigidbodyを持っていればすり抜け、Continuous Dynamicモードでは基本的にすり抜けなくなります。

文字だけではわかりにくいと思うので、球オブジェクトをものすごい速さで壁に当てたらどうなるのかそれぞれ検証してみましょう。

使用するコードは、

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

public class NewBehaviourScript : MonoBehaviour {


    //ゲーム起動時に呼び出される
    void Start()
    {
        //Rigidbodyを取得
        var rb = GetComponent<Rigidbody>();

        rb.AddForce(1000000.0f, 0, 0);

    }
}

Discrete

Discreteモードはものすごい速さでオブジェクトが当たったときはすり抜けます。

Continuous

Continuousは壁側にRigidbodyが付いているか否かで挙動が異なります。

壁側にRigidbodyが付いていない場合は、すり抜けません

壁側にRigidbodyが付いている場合すり抜けてしまいます。

Continuous Dynamic

Continuous Dynamicは壁側にRigidbodyが付いていてもすり抜けません

どのような状態でもすり抜けさせたくない場合はContinuous Dynamicにしておくと良いのでしょうか。

Constraints

ConstraintsはRigidbodyを追加したオブジェクトの移動や回転に制限をかけることができます。

Constraintsをスクリプトで制御したい場合はこちらの記事をご覧ください『Constraintsをスクリプトで制御しよう!

まとめ

この記事では

・Rigidbodyの移動
・Rigidbodyの停止
・Rigidbody2D
・Rigidbodyの各項目

についてまとめてきました。

unityでゲーム製作をする場合Rigidbodyはよく使いますので、この記事を読んで少しでも理解が深まったのなら幸いです!