ヒキニートがゲームを作るブログ

Unityでゲームを作る過程を投稿します

武器弾薬【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を初期状態に戻し、再度弾の発射が始まります。

動画