武器弾薬【UnityでRTSを作る 6】
そろそろ拠点の実装をする頃合いだと思うので、
最初に弾薬補給型の拠点を作るべく、武器弾薬を実装します。
弾薬
ステータスの実装
最初に弾薬に関する変数とプロパティを用意します。
Weapon.cs
[Header("Ammunition")] [SerializeField] private int _Ammo = 10; [SerializeField] private int _Magazine = 3; public int I_Magazine { get; private set; } public int I_Ammo { get; private set; } public bool IsEmpty { get { return Magazine == 0 && Ammo == 0; } } public int Ammo { get { return _Ammo; } set { _Ammo = Mathf.Clamp(value,0,value); if (Ammo == 0 && Magazine > 0 && Application.isPlaying) StartCoroutine(ReloadCoroutine()); } } public int Magazine { get { return _Magazine; } set { _Magazine = Mathf.Clamp(value,0,value); } } private void Awake () { I_Magazine = Magazine; I_Ammo = Ammo; } private void OnValidate () { Magazine = _Magazine; Ammo = _Ammo; }
Ammo(弾薬)とMagazine(弾倉)は共に0が下限になります。
Ammoには弾薬が0になって弾倉がまだあるときに、
後述のリロード処理を行い始めます。
また、「I_〇〇」というプロパティは「初期状態の~」という意味があります。
今回の場合は初期状態のAmmoとMagazineを保存します。
弾の発射でステータスを変化させる
弾の発射を行うための関数にステータスを変化させる処理を追加します。
Weapon.cs
public void Shoot () { for (int i = 0;firingPoints.Length > i;i++) { bullet.Shot(firingPoints[i],Parent,power,speed,time); } Ammo--; } private IEnumerator ShootCoroutine () { Magazine--; while (!IsEmpty) { Shoot(); yield return new WaitForSeconds(interval); } }
Shoot関数にはAmmoを減らす処理、
ShootCoroutineには発射開始時にMagazineを減らす処理を実装しました。
またwhileの条件を「弾薬が完全に空でないこと」にしました。
リロード
次はリロード処理を実装します。
Weapon.cs
public float reload = 2; public bool IsReloading { get; private set; } private IEnumerator ReloadCoroutine () { if (IsEmpty || IsReloading) yield break; ShootStop(); IsReloading = true; yield return new WaitForSeconds(reload); Ammo = I_Ammo; IsReloading = false; ShootStart(); }
reload変数がリロード時間です。
リロードが始まると現在の弾の発射が止まり、reload秒待ちます。
待った後はAmmoを初期状態に戻し、再度弾の発射が始まります。