【Unity初心者向け】オブジェクトの回転⑤ | Rigidbody / Rigidbody2Dを使った回転
これまでの記事では、transform.eulerAngles や Transform.Rotate() を使って、オブジェクトを回転させる方法を確認してきました。
これらは直感的に分かりやすく、まず最初に覚える回転方法として理解しやすいと思います。
ただし、Unityではオブジェクトに Rigidbody / Rigidbody2D が付いている場合、回転のさせ方を少し意識する必要があります。
今回は、
Transformで直接回す場合との違い
Rigidbody2D.angularVelocity
MoveRotation()
物理演算中にTransformを直接変更しない理由
FixedUpdate
このあたりを、初心者向けに整理していきます。
1.Rigidbodyの回転
1-1.Rigidbodyを使うなら、回転もRigidbody側で
最初に結論を言うと、Rigidbody / Rigidbody2D が付いているオブジェクトは、Transformを直接変更するより、Rigidbody側の機能で回転させる方が自然です。
Transformで回す方法は、
向きを直接変える
見た目として回転させる
シンプルで分かりやすい
という特徴があります。
一方、Rigidbody / Rigidbody2D を使う方法は、
物理演算の流れの中で回転する
衝突や移動との相性がよい
物理ベースの動きとして扱いやすい
という特徴があります。
たとえば、
物理演算で動く車
回転しながらぶつかるオブジェクト
Rigidbody2Dで制御するプレイヤー
砲台や歯車のような物理オブジェクト
などでは、Rigidbody側で回転を扱う考え方が重要になります。
1-2.Transformで回す場合との違い
まずは、これまで使ってきたTransformの回転を確認します。
たとえば、次のようなコードです。
transform.Rotate(0, 0, 100 * Time.deltaTime);これは、今の向きに回転量を追加する書き方でした。
また、こちらのように角度を直接設定することもできました。
transform.eulerAngles = new Vector3(0, 0, 45);こちらは、向きを直接45度にする書き方です。
つまりTransformの回転は「見た目の回転を直接変更する」というイメージです。
一方、Rigidbody2D を使う場合は少し考え方が変わります。
たとえば、次のように書きます。
rb.angularVelocity = 100f;これは「1秒あたり何度で回転するか」を設定しているイメージです。
Transformが「向きを直接変える」のに対して、Rigidbody2Dは「物理演算の中で回転する速さを与える」という違いがあります。

2.Rigidbody2Dのサンプル
2-1.Rigidbody2Dを準備する
今回は2Dの回転を中心に説明するので、Rigidbody2D を使います。
まずは回転させたい2Dオブジェクトに、Rigidbody 2D を追加します。

スクリプト側では、次のように取得します。
Rigidbody2D rb; //Rigidbody2D の参照
void Start()
{
// Rigidbody2D コンポーネントを取得
rb = GetComponent<Rigidbody2D>();
}これで、同じオブジェクトについている Rigidbody2D を使えるようになります。
今回の回転確認では、次の設定にしておくと分かりやすいです。
Gravity Scale = 0
Freeze Rotation = オフ

重力の影響をなくしておくと、回転だけを見やすくなります。
また、回転を固定してしまうと、せっかく設定しても回らないので注意しましょう。
2-2.angularVelocityで回転させる
Rigidbody2Dで最初に覚えやすいのが、angularVelocity です。
rb.angularVelocity = 100f;これは、オブジェクトに 1秒あたり100度の回転速度を与える
という意味です。
2Dでは回転は基本的に Z軸まわり なので、angularVelocity は float で扱えます。
たとえば、作成済みのコードに次のコードを追加すると、ずっと回転し続けます。
void FixedUpdate()
{
rb.angularVelocity = 100f;
}これで一定の速さで回転します。
回転方向は、正負で変わります。
rb.angularVelocity = 100f;
rb.angularVelocity = -100f;
このように、値の符号を変えることで回転方向を反転できます。
「右に回る」「左に回る」は、見た目や座標のとらえ方で少し印象が変わることがありますが、正負で方向が変わるという考え方を押さえておけば十分です。

2-3.入力に合わせて回転させる
前回までの記事では、左右キー入力に合わせてTransformで回転する方法を確認しました。
同じことをRigidbody2Dでやると、次のように書けます。
public float rotationSpeed = 100f; // 回転速度
Rigidbody2D rb; // Rigidbody2Dコンポーネントへの参照
void Start()
{
// Rigidbody2Dコンポーネントを取得
rb = GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
// 水平方向の入力を取得
float x = Input.GetAxisRaw("Horizontal");
// Rigidbody2Dの角速度を設定して回転させる
rb.angularVelocity = -x * rotationSpeed;
}このコードの考え方
Input.GetAxisRaw("Horizontal") は、
左キー → -1
入力なし → 0
右キー → 1
を返します。
その値に rotationSpeed を掛けることで、
右入力なら片方向に回転
左入力なら逆方向に回転
入力なしなら止まる
という動きが作れます。
前回の「Transform.Rotateで回す」方法とかなり似た考え方ですが、今回はRigidbody2Dの回転速度を変更しているところがポイントです。

2-4.Rigidbodyの操作はFixedUpdate
ここで大事なのが FixedUpdate です。
これまでのTransform操作では、主に Update を使ってきました。
void Update()
{
transform.Rotate(0, 0, 100 * Time.deltaTime);
}一方、Rigidbody / Rigidbody2D を使うときは、物理演算のタイミングに合わせて処理したいので、FixedUpdate を使うことが多くなります。
void FixedUpdate()
{
rb.angularVelocity = 100f;
}UpdateとFixedUpdateの違い
Update
毎フレーム呼ばれる
入力や画面更新に向いているFixedUpdate
一定間隔で呼ばれる
物理演算に向いている
Rigidbody2Dの移動や回転は、物理演算の流れに合わせて処理する方が安定しやすいため、FixedUpdate がよく使われます。

3.MoveRotation()で回転
次に紹介したいのが MoveRotation() です。
angularVelocity は「回転速度」を設定する方法でしたが、MoveRotation() は 回転角度を指定して回す ときに便利です。
たとえば、次のように書けます。
rb.MoveRotation(45f);これで、Rigidbody2Dを45度の向きへ回転させるイメージです。
ただし、実際には一気に角度を変えるより、現在の角度に少しずつ回転量を足していく形で使うことが多いです。
3‐1.MoveRotation()のサンプル
public float rotationSpeed = 100f;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
float angle = rb.rotation + rotationSpeed * Time.fixedDeltaTime;
rb.MoveRotation(angle);
}コードの考え方
rb.rotation で今の角度を取得し、そこへ
rotationSpeed * Time.fixedDeltaTimeを足しています。
つまり、
今の角度を基準にする
少しだけ回転量を追加する
その角度へ MoveRotation() で回す
という流れです。
これは、Transformの += の考え方に少し似ています。
3‐2.angularVelocityとMoveRotation()の違い
この2つは似て見えますが、考え方が少し違います。
angularVelocity
rb.angularVelocity = 100f;これは、回転の速さを指定する方法です。
言い換えると「1秒あたり何度で回るか」を決めています。
MoveRotation()
rb.MoveRotation(angle);これは、その角度へ回転させる方法です。
言い換えると「次はこの角度にしたい」という指定に近いです。
ざっくり使い分けると
回転速度で考えたい → angularVelocity
目標の角度で考えたい → MoveRotation()
初心者のうちは、
「くるくる回し続けたいなら angularVelocity」
「角度を計算して向きを変えたいなら MoveRotation()」
くらいの理解で十分です。

4.Rigidbodyを使った回転のポイント
4-1.物理演算中にTransformを直接変更しない理由
ここが今回の大事なポイントです。
Rigidbody / Rigidbody2D を使っているのに、同時にTransformを直接変更すると、物理演算との食い違いが起きることがあります。
たとえば、次のようなコードです。
void Update()
{
transform.Rotate(0, 0, 5);
}見た目としては回っているように見えますが、Rigidbody2Dは物理演算の中で
今どこにあるか
どの向きを向いているか
どんな速度で動いているか
を管理しています。
そこへTransformから直接
位置
回転
を変更してしまうと「物理演算が考えている状態」と「見た目としての状態」がズレることがあるのです。
その結果、
当たり判定が不自然になる
めり込みやガタつきが起こる
衝突時の動きがおかしくなる
思ったように制御できなくなる
といった問題につながることがあります。
つまりRigidbody2Dが付いているオブジェクトは、
移動なら Rigidbody2D 側
回転も Rigidbody2D 側
で考える方が安全です。

4-2.入力はUpdate、回転処理はFixedUpdate
少し丁寧にやるなら、入力取得と物理処理を分ける書き方もあります。
public float rotationSpeed = 100f;
private Rigidbody2D rb;
private float inputX;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
inputX = Input.GetAxisRaw("Horizontal");
}
void FixedUpdate()
{
float angle = rb.rotation - inputX * rotationSpeed * Time.fixedDeltaTime;
rb.MoveRotation(angle);
}このコードでは、
Update() で入力を受け取る
FixedUpdate() でRigidbody2Dを回転させる
という役割分担をしています。
これは少し発展的ですが、考え方としてはとても大事です。
4-3.Transform版とRigidbody2D版の使い分け
ここまでを整理すると、次のようになります。
Transformで回す方法
シンプルで分かりやすい
見た目を直接回したいときに便利
物理演算を使わないオブジェクト向き
Rigidbody2Dで回す方法
物理演算との相性がよい
衝突や速度と合わせて扱いやすい
Rigidbody2Dを使うオブジェクト向き
どちらが良い悪いではなく、
用途によって使い分ける
ことが大切です。

今回のまとめ
今回は、Rigidbody / Rigidbody2D を使って回転する方法を確認しました。

こちらはUnity初心者向けの記事をテーマ別にまとめています。
▼ Unity初心者向け記事まとめはこちら
こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。

ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!