速度
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 5/71。
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になりました。新しい名前を使いましょう。
チャレンジ
簡単ロボットを正確に speed m/s で歩かせ、端から落ちるようにします。
FixedUpdate()で、float h = Input.GetAxisRaw("Horizontal");と、"Vertical"からfloat vを読み取ります。- 重力の y を維持したまま、
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, v * speed);を設定します。
「プレイ」を押して端から歩きます。キーを離すとロボットは止まり、落下します。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class RobotWalk : MonoBehaviour
{
public float speed = 3f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// 矢印キーで、重力によるy方向の速度を維持しながら、正確にspeedの速さで移動する
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド