こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Freeze Rotationってなに?」
「Freeze Rotationを設定するとどんなことがあるの?」
というお悩みの方に向けた内容となっています。
Unityでは、Rigidbodyコンポーネントを使って、オブジェクトに対して物理的な動きを付けることができます。
そして、このRigidbodyを持つオブジェクトは、力の加わりなどで自然に回転するようになりますが、この回転を防ぐ仕組みがFreeze Rotationという設定です。
Freeze Rotationは、特定の軸に対しての回転を防止するという役割のある機能で、X軸・Y軸・Z軸におけるオブジェクトの回転を防ぐことができます。
そこで、このページでは、UnityでRigidbodyを付けた際に使うことができるFreeze Rotationという設定について、どんな仕組みなのか、また使い方までをまとめていきます。
Freeze Rotationとは?回転を防止するRigidbodyの機能
まずは、Freeze Rotationがどういうものなのかについて、紹介していきます。
Freeze Rotationとは、Rigidbodyコンポーネントを持つオブジェクトに対して、回転を防止する役割を持っている機能です。
もう少し具体的にいうと、Rigidbodyを持つオブジェクトは物理演算の機能が働くことになるので、力の加え方次第でオブジェクトが回転することがあります。

このオブジェクトの回転が予期していないものである場合、Freeze Rotationを設定することで、以下のようにオブジェクトを回転させないようにすることができます。

Freeze Rotationの使い方・設定
ここからは、実際にFreeze Rotationの使い方を紹介していきます。
回転を防止させたい軸にチェックを入れて使う
Freeze Rotationを使う際は、そのオブジェクトの回転を防止させたい軸にチェックを入れることになります。
具体的には、
を入れることになり、XYZ軸の全てにおける回転を防いだり、XとZ軸の回転だけを防いだりすることもできます。

なお、2Dゲームでは、画面の奥に向かうZ軸の回転を防止するFreeze Rotation Zのみの項目となります。

例えば、2Dゲームでプレイヤーと見立てた四角い縦長のオブジェクトを配置して、このオブジェクトにRigidbody2DとCollider2Dのコンポーネントを付けておきます。

このオブジェクトに対して以下のスクリプトをアタッチして、スペースキーを押したら後ろからAddForceメソッドで力を加える処理を行ってみます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rb;
Vector2 force = new Vector2(150, 0); // 力を加えるベクトル
void Start()
{
rb = GetComponent<Rigidbody2D>(); // Rigidbodyコンポーネントを取得する
}
void Update()
{
// スペースキーを押した場合の処理
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(force);
}
}
}

オブジェクトが前に少し進んだ後に、回転してすぐに倒れてしまいます。
そこで、Freeze RotationのZの項目にチェックを入れてみましょう。

すると、Z軸(画面奥)を中心とした回転を防ぐことができるので、

オブジェクトが倒れずに前に進むことができます。
このように、Freeze Rotationを設定しておくことで、オブジェクトの回転を防ぐことができるようになります。
スクリプトからFreeze Rotationを設定する
Freeze Rotationは、スクリプトからでも設定することができます。
なお、スクリプトから設定する場合は先にRigidbodyコンポーネントをGetComponentメソッドなどで取得しておく必要があります。
Freeze RotationのXを設定
スクリプトからFreeze RotationのXを設定したい場合は、
Rigidbody.constraints = RigidbodyConstraints.FreezeRotationX;
と記述していきます。
例えば、スペースキーを押したらFreeze RotationのXを設定するという際は、
using UnityEngine;
public class Test : MonoBehaviour
{
Rigidbody rb; // Rigidbodyコンポーネント用の変数
void Start()
{
rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得する
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.constraints = RigidbodyConstraints.FreezeRotationX; // FreezeRotation Xを設定する
}
}
}
と16行目のように記述しておくことで、スペースキーを押したらFreeze RotationのXが設定されて、X軸の回転を防止することができます。
Freeze RotationのYを設定
スクリプトからFreeze RotationのYを設定したい場合は、
Rigidbody.constraints = RigidbodyConstraints.FreezeRotationY;
と記述していきます。
例えば、スペースキーを押したらFreeze RotationのYを設定するという際は、
using UnityEngine;
public class Test : MonoBehaviour
{
Rigidbody rb; // Rigidbodyコンポーネント用の変数
void Start()
{
rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得する
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.constraints = RigidbodyConstraints.FreezeRotationY; // FreezeRotation Yを設定する
}
}
}
と16行目のように記述しておくことで、スペースキーを押したらFreeze RotationのYが設定されて、Y軸の回転を防止することができます。
Freeze RotationのZを設定
スクリプトからFreeze RotationのZを設定したい場合は、
Rigidbody.constraints = RigidbodyConstraints.FreezeRotationZ;
と記述していきます。
例えば、スペースキーを押したらFreeze RotationのZを設定するという際は、
using UnityEngine;
public class Test : MonoBehaviour
{
Rigidbody rb; // Rigidbodyコンポーネント用の変数
void Start()
{
rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得する
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.constraints = RigidbodyConstraints.FreezeRotationZ; // FreezeRotation Zを設定する
}
}
}
と16行目のように記述しておくことで、スペースキーを押したらFreeze RotationのZが設定されて、Z軸の回転を防止することができます。
Freeze RotationのXYZをすべて設定する
スクリプトからFreeze RotationのXYZをすべて設定することもできます。
その場合は、
Rigidbody.constraints = RigidbodyConstraints.FreezeRotation;
とスクリプトで記述してあげることになります。
例えば、スペースキーを押したらFreeze RotationのXYZをすべて設定するという際は、
using UnityEngine;
public class Test : MonoBehaviour
{
Rigidbody rb; // Rigidbodyコンポーネント用の変数
void Start()
{
rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得する
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.constraints = RigidbodyConstraints.FreezeRotation; // FreezeRotationをすべて設定する
}
}
}
と16行目のように記述しておくことで、スペースキーを押したらFreeze RotationのXYZがすべて設定されて、オブジェクトの全ての回転を防止することができます。
Freeze Rotationの設定を解除する
スクリプトからFreeze Rotationの設定を解除したい場合は、
Rigidbody.constraints = RigidbodyConstraints.None;
と記述してあげることで可能です。
ただし、Freeze Rotationの全ての軸が解除されて、移動を防止する機能であるFreeze Positionの設定も解除されることになるので、注意しておきましょう。
例えば、スペースキーを押したらFreeze Rotationの設定を解除したいという場合は、
using UnityEngine;
public class Test : MonoBehaviour
{
Rigidbody rb; // Rigidbodyコンポーネント用の変数
void Start()
{
rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得する
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.constraints = RigidbodyConstraints.None; // FreezeRotationを解除する
}
}
}
と16行目のように記述しておくことで、スペースキーを押したらFreeze RotationとFreeze Positionの設定がすべて解除されます。
まとめ
このページでは、UnityのRigidbodyコンポーネントで使うことができるFreeze Rotationという機能について、どんな機能なのか、仕組みや使い方までをまとめていきましたが、いかがでしたでしょうか?
Freeze Rotationとは、Rigidbodyによるオブジェクトの回転を防止することができる機能で、特定の軸を指定して設定することができます。
ゲーム内では、プレイヤーなどのオブジェクトがつまずいて転倒してしまわないように、Freeze Rotationを転倒防止で付けることが多いです。
他にも、オブジェクトの回転の見せ方を変えたり、ゲーム内の表現としても使うことができるでしょう。
最後までお読みいただきまして、ありがとうございました!
コメント