速度
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 5/63。
rb.linearVelocityは、ボディが今どのように動いているかを表します。x、y、z方向の秒速を表すVector3です。これを読み取るとボディがどちらに進んでいるかがわかり、rb.linearVelocity.magnitudeはその速さです。これを設定すると、助走も質量の影響もなく、動きがすぐに変わります。1 kgの箱も50 kgの金庫も、2 m/sに設定すれば、次の物理ステップから正確に2 m/sで動きます。その後も重力、摩擦、衝突の影響を受け続けます。
このゴーカートは、正確にcruise m/sで前進します。速度をコピーしてzだけを変更し、元に戻して代入するので、重力によって生じたy方向の速度は保たれ、カートはランプの端から落ちます。
void FixedUpdate()
{
Vector3 vel = rb.linearVelocity;
vel.z = cruise; // 前方へ正確に cruise m/s で進む
rb.linearVelocity = vel; // y は重力によって変化した値を維持する
}yも0に設定すると、各ステップで重力による速度が失われ、カートは落下せずにランプからゆっくり滑り落ちることになります。Unity 6より前は、このプロパティはvelocityという名前でした。古いチュートリアルでは今もrb.velocityと書かれています。Unity 6ではコンパイルできますが、velocityは非推奨で、linearVelocityに名前が変更されたという警告が表示されます。同様に、dragはlinearDampingになりました。新しい名前を使いましょう。
チャレンジ
簡単ロボットは高くなったプラットフォームの上を歩きます。矢印キーで、x軸に沿って左右に、z軸に沿って前後に、raw axesを使って加速なしで正確にspeed m/s(Inspectorでは3)で歩かせましょう。
- 矢印キーを押していないときは、すぐに静止します。
- 重力は引き続き作用します。端から歩いて出ると、ロボットは下の地面に落ちます。
Playを押して端から歩かせ、次にCheckを押します。
自分で試してみよう
using UnityEngine;
public class RobotWalk : MonoBehaviour
{
public float speed = 3f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// 矢印キーでちょうどspeedの速さで移動し、重力によるy方向の速度を維持する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。