転がるボール
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 27/63。
この章では、小さなゲーム「Coin Rush」を作ります。壁に囲まれたアリーナで矢印キーを使ってボールを転がし、時間切れになる前にコインを集めます。Unityのプロジェクトと同じように、2つのスクリプトで処理を分担します。Ballはボールを動かし、スコアと時計を管理します。Coinは各コインに配置します。Coin.csは空のクラスから始まり、次のレッスンで内容を追加します。
ボールは、位置を直接置き換えるのではなく、押すと転がります。AddForceを使ってRigidbodyに力を加え、回転は自由にしておきます。力でボールが動き、床との摩擦がボールの底面を捉えて回転させます。Spaceキーを押している間、このボウリングボールはレーンを転がり続けます。
public float push = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
if (Input.GetKey(KeyCode.Space))
{
rb.AddForce(Vector3.forward * push);
}
}滑らずに転がるボールは、速度を半径で割った値で回転します。そのため、半径0.5のボールが毎秒3ユニットで移動すると、毎秒6ラジアンで回転します(rb.angularVelocity)。代わりにtransform.positionを変更するか、RigidbodyのConstraintsで回転を固定すると、回転せずにパックのように滑ります。単色の球体はどちらの場合も見た目が同じです。転がりを確認するには、ゲームの実行中にRigidbodyのInfoセクションにあるAngular Velocityを見てください。
チャレンジ
中級ボールを使って Coin Rush を始めましょう。インスペクターで Ball の force を 10 に設定します。
Start()で、ボールのRigidbodyをrbに格納します。FixedUpdate()で、矢印キーを使ってボールを押し動かします。x 方向にはInput.GetAxis("Horizontal")、z 方向にはInput.GetAxis("Vertical")を使い、どちらもforceを掛けます。- ボールが転がるように、回転は自由にしておきます。
今のところ Coin.cs はそのままにしておきます。再生を押し、ゲーム画面をクリックしてアリーナ内を転がり回ってから、確認を押します。
自分で試してみよう
using UnityEngine;
public class Ball : MonoBehaviour
{
public float force = 10f;
private Rigidbody rb;
void Start()
{
}
void FixedUpdate()
{
// 矢印キーでボールを動かす:Horizontal は x 軸方向、Vertical は z 軸方向。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。