はじめに
Unityでは、Rigidbodyコンポーネントを使うことで、簡単に物体に重力の影響やリアルな動作をさせることができるようになります。
これができるようになると、ドミノ倒しやピンボール、レースゲーム、物理パズルなど様々な用途で役に立ちます。
本記事では、物体に力を与えて移動させたり回転させる方法について解説します。
Rigidbodyとは?基本的な使い方については、こちらを参照してください。
物体に力を加えて移動させよう
AddForceメソッドを使用する方法
RigidbodyのAddForceメソッドを使用することで、物体に力を加えることができます。以下は、AddForceメソッドを使用して物体に力を加える例です。
// 力を加える方向と強さを指定する
public Vector3 forceDirection = new Vector3(1, 0, 0);
public float forceStrength = 200.0f;
private void Update()
{
// スペースキーを押したら動かす
if (Input.GetKeyDown(KeyCode.Space))
{
// Rigidbodyに力を加える
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(forceDirection * forceStrength);
}
}
Rigidbodyコンポーネントを取得して、AddForceメソッドを使用して物体に力を加えています。forceDirection変数で力を加える方向を指定し、forceStrength変数で力の強さを指定しています。
再生してみると、キューブが動きました。
物体を回転させてみよう
RigidbodyのAddTorqueメソッドを使用する方法
AddTorqueメソッドは、物体にトルクを加えることで回転させることができます。例えば、以下のように、RigidbodyにAddTorqueメソッドを使用して、物体を回転させることができます。
public Vector3 torque = new Vector3(0, 1, 0);
private void FixedUpdate()
{
// スペースキーを押したら動かす
if (Input.GetKey(KeyCode.Space))
{
// Rigidbodyに力を加える
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddTorque(torque,ForceMode.Acceleration);
}
}
Rigidbodyにy軸周りのトルクを加えることで、物体を回転させています。
スペースキーを押し続けていると、徐々に物体が回転していきます。
補足1:UpdateとFixedUpdateの違い
UpdateとFixedUpdateは状況に応じて使い分ける必要があります。こちらの記事が非常に詳しく解説されてありました。
補足2:AddTorque, Addforceの第二引数 ForceMode
AddTorqueやAddforceの第二引数にForceModeという変数があります。これを設定することで、力の加え方を変えることができます。設定しない場合は、Force設定となります。
https://docs.unity3d.com/ja/2021.2/ScriptReference/ForceMode.html
Force 質量を使用して、リジッドボディへ継続的な力を加えます。 Acceleration その質量を無視して、リジッドボディへ継続的な加速を追加します。 Impulse その質量を使用し、リジッドボディにインスタントフォースインパルスを追加します。 VelocityChange 質量を無視して、リジッドボディにインスタント速度変化を追加します。 Foce modeの種類
物体を停止させるには?
AddForceやAddTorqueを使用して、反対方向の力やトルクを加える方法
AddForceやAddTorqueを使用して、反対方向の力やトルクを加えることで、物体を停止させることができます。例えば、以下のように、反対方向に一定の力を加えることで、物体を停止させることができます。
// 力を加える方向と強さを指定する
public Vector3 forceDirection = new Vector3(1, 0, 0);
public float forceStrength = 10.0f;
private void FixedUpdate()
{
// スペースキーを押したら動かす
if (Input.GetKey(KeyCode.Space))
{
// Rigidbodyに力を加える
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(forceDirection * forceStrength);
}
// 下矢印キーを押したら止める
if (Input.GetKey(KeyCode.DownArrow))
{
// Rigidbodyに逆方向の力を加える
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(-rb.velocity * rb.mass);
}
}
上記のスクリプトでは、Rigidbodyのvelocityを反対方向に掛けた力を加えることで、物体を停止させています。スペースキーで力を加えて、下矢印キーを押し続けると止まります。
RigidbodyのvelocityやangularVelocityを0に設定する方法
velocityやangularVelocityを0に設定することで、物体を直接停止させることができます。例えば、以下のように、velocityとangularVelocityを0に設定することで、物体を停止させることができます。
// RigidbodyのvelocityとangularVelocityを0に設定する
Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;
これらの方法を使用することで、Rigidbodyで物体を停止させることができます。方法によっては、物体がすぐに停止するわけではなく、停止するまでに時間がかかることがあります。また物体が静止状態になるわけではなく、微小な動きを続けることがあるので、注意が必要です。
おわりに
Rigidbodyを使った、物理演算で物体を移動・回転・停止させる方法の紹介でした!車のように動き始めや停止ができるので、レースゲームに活用できそうです。
物理演算を使うことで、よりリアルな動作が実現できる反面、処理が重くなるデメリットもあるので、必要なものだけにとどめるようにしましょう。