- Home /
Reload system staying at full magazine for as long as reload time?
So, I am trying to implement a reload system into my game, and it works very well, except for one thing. When the gun is finished reloading, it stays at full capacity for as long as it's reload time! My code:
using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro;
public class gunShoot : MonoBehaviour { public GameObject bullet; public GameObject muzFlash; public Transform bulletStart; public bulletProp bProp; public float reloadLeft; public int shotsFired; public bool ready; public ParticleSystem muzSystem; public TMP_Text shotText; // Start is called before the first frame update void Start() { shotsFired = 0; bProp = bullet.GetComponent(); muzFlash = bulletStart.Find("muzFlash").gameObject; muzSystem = muzFlash.GetComponent(); shotText = GameObject.Find("shotsLeft").GetComponent(); }
// Update is called once per frame
void Update()
{
int shotsRemaining = bProp.maxShots - shotsFired;
string shotsLeftText = shotsRemaining.ToString();
shotText.SetText(shotsLeftText);
if(reloadLeft < 0f)
{
ready = true;
} else
{
ready = false;
reloadLeft -= Time.deltaTime;
}
if(shotsFired >= bProp.maxShots)
{
IEnumerator reloadCoro = Reload(bProp.restockTime);
StartCoroutine(reloadCoro);
}
switch (bProp.semiAuto)
{
case false:
if (Input.GetMouseButton(0) && shotsFired < bProp.maxShots)
{
Shoot();
}
break;
case true:
if (Input.GetMouseButtonDown(0) && shotsFired < bProp.maxShots)
{
Shoot();
}
break;
}
}
void Shoot()
{
if(ready == true)
{
for (int i = 0; i < bProp.bulletCount; i++)
{
GameObject bulletInstance = Instantiate(bullet, bulletStart.position, bulletStart.rotation);
Rigidbody2D bulletRb = bulletInstance.GetComponent<Rigidbody2D>();
bulletInstance.transform.Rotate(0, 0, Random.Range(-bProp.spread, bProp.spread));
bulletRb.AddForce(bProp.bulletSpeed * bulletInstance.transform.up * Time.deltaTime);
shotsFired++;
}
muzSystem.Play();
reloadLeft = bProp.reloadSpeed;
}
}
IEnumerator Reload(float waitTime)
{
yield return new WaitForSeconds(waitTime);
shotsFired -= bProp.maxShots;
}
}
Answer by HellsHand · May 17, 2021 at 08:43 PM
What's happening is when shotsFired >= bProp.maxShots
there is a delay of waitTime
before shotsFired -= bProp.maxShots
, for the entire time that delay is active you are calling your Coroutine every frame since shotsFired
will be >=
to bProp.maxShots
until the Coroutine resolves. A simple bool
should solve it:
bool reloading;
if(shotsFired >= bProp.maxShots && !reloading)
{
reloading = true;
IEnumerator reloadCoro = Reload(bProp.restockTime);
StartCoroutine(reloadCoro);
}
and then in the Coroutine do:
IEnumerator Reload(float waitTime)
{
yield return new WaitForSeconds(waitTime);
shotsFired -= bProp.maxShots;
reloading = false;
}
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
How to resume animation where it left off? 3 Answers
realistic reload system? 1 Answer
Renderer on object disabled after level reload 1 Answer
Distribute terrain in zones 3 Answers