プレイヤー、オブジェクトを重力に従って自然に落下させたい。
レースゲームなどで車のアクセルを踏んで徐々に加速させたい。
力を加えられ飛んでいくサッカーボールのような表現がしたい。
そんな感じの自然な表現が簡単にできてしまうrigidbodyの機能を説明していきます。
手っ取り早い実装方法
オブジェクトにrigidbodyを付けてみる
AddForceで力を加えて移動させる
質量を考慮して継続的に力を加えます。
Rigidbody rb; private readonly int power = 5; void Start() { //自分に付いているrigidbodyを取得 this.rb = GetComponent<Rigidbody>(); } void Update() { this.rb.AddForce(Vector3.forward * this.power, ForceMode.Force); }
Accelerationで継続的に力を加える
質量を無視して継続的に力を加えます。
void Update() { this.rb.AddForce(Vector3.forward * this.power, ForceMode.Acceleration); }
Impulseで瞬間的に力を加える
質量を考慮して瞬間的に力を加えます。
Rigidbody rb; private readonly int power = 20; void Start() { //自分に付いているrigidbodyを取得 this.rb = GetComponent<Rigidbody>(); //こっちはstartに記述 this.rb.AddForce(Vector3.forward * this.power, ForceMode.Impulse); }
VelocityChangeで瞬間的に力を加える
質量を無視して瞬間的に力を加えます。
void Start() { //自分に付いているrigidbodyを取得 this.rb = GetComponent<Rigidbody>(); //こっちはstartに記述 this.rb.AddForce(Vector3.forward * this.power, ForceMode.VelocityChange); }
詳しい解説
上の例では質量考慮無視の挙動に大差はありませんが
RigidbodyコンポーネントのMass(質量)の数値を大きくすると大きく違いが現れます。
transform.forwardとVector3.forwardによる挙動の違い
もしVector3.forwardをtransform.forwardに変えた場合
this.rb.AddForce(transform.forward * this.power, ForceMode.Force);
前に進まずその場でうろうろしていますね。
ざっくり説明すると
Vector3.forwardはどんな時でも世界から見てこっちが前といった感じに決まっていて
その方向に力が働くようになっています。
一方transform.forwardでは自分から見てこっちが前といった感じになります。
なので 前に進む➜ボールが回転する➜
回転することで自分から見て前方向が変わる➜前に進む
を繰り返しているようになります。
どちらも適した場面が出てくると思うので必要に応じて使い分けましょう。
まとめ
Rigidbodyはかなり強力なコンポーネントです。
当たり判定など扱う際にも必要になってくるのでぜひ活用しましょう。
今回は説明していませんが
Mass(質量)やUse Gravity(重力を適用するか)などのパラメーターが存在するので
色々実験しながら覚えていきましょう。