大砲の射程
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 61/63。
射撃場の一方の端に大砲があり、3つの標的がそれぞれ異なる距離で射撃場を左右に滑って移動します。砲身を上下に傾けて各距離に合わせ、標的が射線を横切るタイミングで射撃します。標的に当たった弾は標的を倒して消費されます。それ以外のものが標的にぶつかっても、標的には影響しません。標的はキネマティックボディなので、衝撃を受けても押されることはなく、大砲には弾が5発あります。
2つのスクリプトを書きます。砲身にはCannonを、各標的にはTargetを設定します。
チャレンジ
難しいInspector で Cannon に ballPrefab(Rigidbody:Ball プレハブ、質量 2、タグは Ball)、angle(30)、turnSpeed(40)、power(30)、balls(5)を設定します。
- 上矢印で
angleを大きくし、下矢印で小さくします。速度は毎秒turnSpeed度で、10 未満にも 60 超にもなりません。毎フレーム、砲身の回転をQuaternion.Euler(-angle, 0, 0)に設定します。Unity では x 角度が正だと前方が下を向くため、マイナス記号を付けると上を向きます。 ballsが 0 より大きい間、Space キーでボールを発射します。砲身の中心から前方へ 1 単位の位置にボールを生成し、砲身の方向にpowerの Impulse を加え、ballsを 1 減らして、残数をBalls left: 4のようにログに出力します。ボールが残っていない場合、Space キーを押しても何も起こりません。
各ターゲットにはキネマティック Rigidbody があり、Inspector で Target の speed と range を設定します(Target1 ではそれぞれ 2 と 3)。
- 物理演算の各ステップで、
MovePositionを使ってターゲットを x 軸に沿って毎秒speed単位で移動させ、開始位置からrange単位離れるたびに向きを反転させます。 - ボール(タグが
Ball)がターゲットに当たったら、ターゲットの名前とhit!をTarget2 hit!のようにログに出力し、ターゲットとボールの両方を破棄します。ボール以外のものが当たっても、ターゲットには影響しません。
Play を押して 3 つすべてのターゲットを倒し、その後 Check を押します。
自分で試してみよう
using UnityEngine;
public class Cannon : MonoBehaviour
{
[SerializeField] private Rigidbody ballPrefab;
[SerializeField] private float angle = 30f;
[SerializeField] private float turnSpeed = 40f;
[SerializeField] private float power = 30f;
[SerializeField] private int balls = 5;
void Update()
{
// 上下の矢印キーで狙いを定め、Spaceで発射する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。