ビー玉ゴルフ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 62/63。
小さなグリーンでビー玉を使ってゴルフをします。ビー玉はティーからスタートします。矢印キーで狙いを定め、Spaceを押し続けてパワーをため、離してショットします。ビー玉は転がり、クッションや中央のブロックに跳ね返りながら減速し、十分に遅くなると完全に止まります。そのとき初めて、もう一度ショットできます。ゆっくりカップに転がり込むビー玉は中に落ちますが、速すぎるとカップをそのまま通り過ぎます。打数は少ないほどよいです。
2つのスクリプトを書きます。ビー玉にはGolf、カップにはHoleを使います。
チャレンジ
難しいInspectorでは、Golfにpointer(小さな黄色のボール)、aimSpeed(90)、chargeRate(4)、maxPower(6)、stopSpeed(0.3)を設定します。ビー玉の質量は0.5です。
- 照準はy軸周りの角度で、開始時は0(正面、+z)です。右矢印で右に、左矢印で左に、1秒あたり
aimSpeed度回転します。フレームごとに、照準の方向にビー玉から1単位の位置へポインターを置きます。 - ビー玉の速度が
stopSpeed未満のとき、ビー玉は静止しています。物理ステップごとに、静止しているビー玉を完全に停止させます。速度と角速度をゼロにします。 - ビー玉が静止している間だけ、Spaceキーを押し続けると1秒あたり
chargeRateの割合でパワーが上がり、maxPowerを超えることはありません。Spaceキーを離すと、そのパワーのImpulseで照準方向にビー玉を打ちます。その後、パワーは0に戻り、publicなint strokesが1増えて、Stroke 1としてログに記録されます。
Inspectorでは、HoleにsinkSpeed(3)を設定します。
- ビー玉(
Golfスクリプトが付いたオブジェクト)がsinkSpeedより遅い速度でカップに入ったとき、打数をIn the cup in 2 strokes!としてログに記録し、ビー玉を非アクティブにします。より速いビー玉はそのまま転がり抜けます。
Playを押し、できるだけ少ない打数でビー玉を沈めてから、Checkを押してください。
自分で試してみよう
using UnityEngine;
public class Golf : MonoBehaviour
{
public int strokes = 0;
[SerializeField] private Transform pointer;
[SerializeField] private float aimSpeed = 90f;
[SerializeField] private float chargeRate = 4f;
[SerializeField] private float maxPower = 6f;
[SerializeField] private float stopSpeed = 0.3f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
// 矢印キーで狙いを定め、Spaceでパワーをため、離すと打ち、速度が遅くなったら止める
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。