アリーナ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 59/71。
この章では「Arena Escape」を作ります。壁に囲まれたアリーナでハンターをかわしながら、次々と押し寄せるハンターの波を切り抜けます。3回攻撃を受けるとゲームオーバーになり、最後のウェーブが終わると出口が開きます。ゲームは最初からプロジェクトにある5つのスクリプトで構成されています。Player、Hunter、Spawner、Health、Exitです。最後の4つは今のところ空で、各レッスンで1つずつ作成します。
プレイヤーは自分で設定する速度ではなく力で移動するため、ハンターからのノックバックが移動に加わり、打ち消されません。押すだけでは速度がいつまでも上がってしまうので、linearDampingによって各ステップで速度が少しずつ減ります。一定の力で押し続けると、最高速度はおよそ加速度を減衰値で割った値に落ち着きます。このホバーソリは、Spaceキーを押している間、前方に進みます。
[SerializeField] private float accel = 12f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
rb.linearDamping = 2f;
}
void FixedUpdate()
{
if (Input.GetKey(KeyCode.Space))
{
rb.AddForce(transform.forward * accel, ForceMode.Acceleration);
}
}加速度が12、減衰値が2の場合、ソリの最高速度は毎秒およそ6ユニットです。Spaceキーを離すと、減衰によってソリはいつまでも滑り続けるのではなく、停止します。ForceMode.Accelerationは質量を無視するため、重いソリも軽いソリとまったく同じように加速します。ソリのコライダーには摩擦のないPhysicsMaterialが設定されています。減衰に加えて床との摩擦もあると、最高速度はさらに低くなります。
チャレンジ
中級Arena Escapeを開始して、力を使ってプレイヤーを滑らせましょう。
Start()内で、GetComponentの行の後にrb.linearDamping = accel / topSpeed;を設定し、速度がtopSpeed付近で落ち着くようにします。FixedUpdate()内で、new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical"))を作成します。- その
normalizedにaccelを掛けた値を、ForceMode.Accelerationを指定してrb.AddForceに渡します。
「プレイ」を押して、アリーナを滑り回りましょう。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Player : MonoBehaviour
{
[SerializeField] private float accel = 18f;
[SerializeField] private float topSpeed = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// 減衰を設定してから、矢印キーでプレイヤーを動かす
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド