- Home /
realistic reload system?
Hello! how do i can to make a realistic reload system from my script? (C#). Thanks!
using UnityEngine;
using System.Collections;
public class Weapon : MonoBehaviour {
public float Damage = 0f;
public float Range = 0f;
public float ImpactForce = 0f;
public float FireRate = 0f;
public int MaxAmmo = 0;
public int TotalAmmo = 0;
public int CurrentAmmo;
public float ReloadTime = 0;
private bool IsReloading = false;
public Camera FPScam;
public ParticleEmitter MuzzleFlash;
public GameObject HitEffect;
private float NextTimeToFire = 0f;
public AudioClip ShootSound;
void Start()
{
CurrentAmmo = MaxAmmo;
}
void OnEnable()
{
IsReloading = false;
}
void Update () {
if(IsReloading)
return;
if(CurrentAmmo <= 0)
{
StartCoroutine(Reload());
return;
}
if(Input.GetButton("Fire1") && Time.time >= NextTimeToFire)
{
NextTimeToFire = Time.time + 1f/FireRate;
Shoot();
}
}
IEnumerator Reload()
{
IsReloading = true;
Debug.Log("Reloading...");
yield return new WaitForSeconds(ReloadTime - 0.25f);
TotalAmmo -= MaxAmmo;
CurrentAmmo = MaxAmmo;
IsReloading = false;
}
void Shoot()
{
MuzzleFlash.Emit();
audio.Play();
audio.clip = ShootSound;
CurrentAmmo--;
RaycastHit hit;
if (Physics.Raycast(FPScam.transform.position, FPScam.transform.forward, out hit, Range))
{
Debug.Log(hit.transform.name);
Target target = hit.transform.GetComponent<Target>();
if(target != null)
{
target.TakeDamage(Damage);
}
if(hit.rigidbody != null)
{
hit.rigidbody.AddForce(-hit.normal * ImpactForce);
}
Instantiate(HitEffect, hit.point, Quaternion.LookRotation(hit.normal));
}
}
}
Answer by Vicarian · Dec 18, 2018 at 09:35 PM
TotalAmmo -= MaxAmmo;
in Reload() isn't right.
TotalAmmo -= CurrentAmmo;
is, which models a tactical reload - you lose unspent ammunition in a magazine you drop and don't catch / retrieve. Most games magically "strip" mags and put this ammo back in a pool, which is unrealistic. You should also have a variable which stores whether or not a round is chambered. The line
CurrentAmmo = MaxAmmo;
isn't necessarily correct if a round is chambered (when performing a tactical reload this will always be the case). If a round was chambered, you can do this statement then add 1.
You'll want animations to actually do the reload if you haven't got them. If this is for VR, then you'll want a bunch more code - namely collision detection, a normal and bounds check, etc.
Thank you! it works, but another thing ... do you know how to make that when you reach 0 the "Current Ammo" can not be triggered? I tried it by myself and it does not work, Thanks again!
I assume you mean you can't fire if TotalAmmo is 0?
In Shoot():
if (TotalAmmo == 0) {
// You can play a "click" here - the sound of a firing pin striking nothing but air
return;
}
$$anonymous$$uzzleFlash.Emit();
audio.Play();
audio.clip = ShootSound;
// ...