【unity入門】Rigitbody2DのBody Typeについて
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についての理解が少しでも深まったのなら幸いです!