CubeにRigidbodyとスクリプトを付けて、回転させながら放り投げます。
Rigidbody rb;
public float torque = 30f;
------
rb.AddForce(Vector3.Lerp(transform.right, transform.up, 0.8f) * torque, ForceMode.Impulse);
rb.AddTorque(Vector3.Lerp(transform.right, transform.up, 0.5f) * torque, ForceMode.Impulse);
AddForceでCubeを移動させます。斜めに動かしたいので、「Vector3.Lerp」を使っています。
参考:https://docs.unity3d.com/ja/current/ScriptReference/Vector3.Lerp.html
ここでは、transform.right(1,0,0)と transform.up(0,1,0)の間の直線上にあって、0~1のfloat値で指定された割合だけ進んだところにある点を示します。Cubeの中心が(0,0,0)です。
0.5fだと、この2点のちょうど真ん中の点になります。
AddTorqueを使うと回転させられます。指定した軸を回るので、斜めに回転させたいときもやはり斜めの軸を指定するのでここでもLerpを使っています。
空気抵抗を使って自然に回転を止める
Angular Drag(回転の空気抵抗)を上げると、回転を止める力が大きくなるので自然に止まります。
もっと大きな値にすると、ほとんど回転しなくなります。
スクリプトでぴたっと止める
rb.angularVelocity = Vector3.zero;
Rigidbody.angularVelocityをゼロにすると回転が止まります。
参考:https://docs.unity3d.com/ja/current/ScriptReference/Rigidbody-angularVelocity.html
回転を再開させたいときは、今の角速度を保存しておいて、再開するときに Rigidbody.angularVelocityに入れ直します。
Rigidbody rb;
Vector3 angularVelocity;
bool stopSpinning = false;
-------
if (Input.GetKeyDown(KeyCode.R)) // キーボードのRキーを押したとき
{
if (stopSpinning)
{
rb.angularVelocity = angularVelocity; // 止まっているときは、保存した角速度に戻す
stopSpinning = false;
}
else {
angularVelocity = rb.angularVelocity; // 動いているときは、今の角速度を保存する
rb.angularVelocity = Vector3.zero; // 回転を止める
stopSpinning = true;
}
}
回転を制限する
RigidbodyコンポーネントのConstraintsから回転を制限できます。
Freeze RotationのXにチェックを入れると、X軸の周りを回転しなくなるので、Y軸(縦軸)の周りだけを回転します。
水平に回っています。
Yにチェックを入れると、Y軸を中心とした回転が制限されます。
まっすぐ縦に回っています。
スクリプトからも変えられます。
Rigidbody.constraints = RigidbodyConstraints.FreezeRotationX;
Rigidbody.constraints = RigidbodyConstraints.None; // 制限しない
Rigidbody.constraints = RigidbodyConstraints.FreezeAll; // 移動も回転もさせない
参考:https://docs.unity3d.com/ja/2017.4/ScriptReference/RigidbodyConstraints.html