【unity入門】Rigidbodyの各項目や移動、停止方法などまとめ
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はよく使いますので、この記事を読んで少しでも理解が深まったのなら幸いです!