- Home /
How to add fireRate to my gun script? (Need Help)
Hello I'm having trouble with a gun script I made. The problem is that I want to integrate FireRate system into the gun script. If you can help me then please comment down below.
using UnityEngine;
using System.Collections;
public class GunNo : MonoBehaviour { //Decal public GameObject decalHit; public float projectileDestroyTimer = 5f;
//Ámmo public int maxAmmoTotal = 30; // Max ammo to carry Example: 30 public int maxAmmoInClipTotal = 5; // Max ammo total to be able to reload Example: 5 public int curAmmo = 30; // Current reloadable ammo Example: 30 public int ammoInClip = 5; // Current ammo in clip Example: 5 private bool isReloading = false;
//Animation public string fireAnimation; //Shoot animation public string clipEmptyAnim; //Clip empty animation public string reloadAnimation; //Reload animation public float reloadTime = 1f; // How long it takes to reload
//GameObjects public GameObject weapon; //Needed for aiming public ParticleSystem muzzleflash; public Animator FireAnimation; public AudioSource GunSounds;
//Raycast private RaycastHit rayHit; public float shootDistance = 200f;
//Recoil private float defaultRecoil = 50f; public float recoil = 50f; public float recoilAiming = 10f;
//Aim public Vector3 aimPos = Vector3.zero; private Vector3 defaultPos = Vector3.zero; public float smoothTime; //How long it takes to get to the aiming position private Vector3 dampVelocity; private bool aiming = false;
//Audio private AudioSource audioSource; //Audio source public AudioClip fireSound; //Sound when shooting public AudioClip clipEmptySound; //Sound when clip is empty public AudioClip reloadSound; //Sound when reloading
//Weapon public int hitDamage = 13;
//Only for testing int removedAmmoRecently; //Only for testing
void Start() { defaultPos = weapon.transform.localPosition; defaultRecoil = recoil; audioSource = GetComponent(); }
void Update() { AimDownSight();
if (Input.GetMouseButtonDown(0) && !isReloading){
Shoot();
}
if(Input.GetMouseButtonDown(1) && !isReloading)
{
aiming = !aiming;
}
if (Input.GetKeyDown(KeyCode.R) && !isReloading)
{
StartCoroutine("Reload");
}
}
void Shoot() { if(ammoInClip != 0) { PlaySound(fireSound); GunSounds.Play(); muzzleflash.Play(); PlayAnimation(fireAnimation); GetComponent().Play("FireAnimation"); ammoInClip--; Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2f + Random.Range(-recoil, recoil), Screen.height/2f + Random.Range(-recoil, recoil), 0f)); if (Physics.Raycast(ray, out rayHit, shootDistance)) { GameObject decalClone = (GameObject)Instantiate(decalHit, rayHit.point, Quaternion.LookRotation(rayHit.normal, Vector3.forward)); Destroy(decalClone, projectileDestroyTimer);
DoDamage(rayHit);
}
}
else{
PlaySound(clipEmptySound);
PlayAnimation(clipEmptyAnim);
}
Debug.Log("Ammo: " + ammoInClip + "/" + curAmmo);
}
void DoDamage(RaycastHit hit) { if(hit.transform.tag == "Enemy") { if(hit.transform.GetComponent()) //You can change EnemyHealth, to the name of the script that contains the health of the enemy { hit.transform.SendMessage("ApplyDamage", hitDamage, SendMessageOptions.DontRequireReceiver); } Debug.Log(hit.transform.name + " has been hit"); } }
IEnumerator Reload() { //If ammoInClip example 5 is equal or greater than 0 and ammoInClip(5) is lower than maxAmmoInClipTotal(The max amount of ammo that can be in a clip) and curAmmo(how much ammo you have like 5/30) is greater than 0 if (ammoInClip >= 0 && ammoInClip < maxAmmoInClipTotal && curAmmo > 0) { isReloading = true; PlaySound(reloadSound); PlayAnimation(reloadAnimation); yield return new WaitForSeconds(reloadTime); removedAmmoRecently = 0; //You can remove this line, it's only for testing. for (int i = 0; i < maxAmmoInClipTotal; i++) { if (ammoInClip == maxAmmoInClipTotal || curAmmo <= 0) { break; } else { ammoInClip++; curAmmo--; removedAmmoRecently++; //You can remove this line, it's only for testing. | To check how much ammo has been removed } } isReloading = false; Debug.Log("Removed " + removedAmmoRecently + " " + "ammo from pocket ammo. Ammo: " + ammoInClip + "/" + curAmmo); //You can remove this line, it's only for testing. | Prints out how much ammo that has been removed, ammo you have in clip, and how much ammo that is left } else { yield break; } }
void PlayAnimation(string anim) { if (anim != "") { weapon.GetComponent().Play(anim); } }
void PlaySound(AudioClip clip) { if (clip != null) { audioSource.PlayOneShot(clip); } }
void AimDownSight() { if(aiming && weapon.transform.localPosition.normalized != aimPos.normalized) { weapon.transform.localPosition = Vector3.SmoothDamp (weapon.transform.localPosition, aimPos, ref dampVelocity, smoothTime); Debug.Log ("Aiming"); recoil = recoilAiming; }
if(!aiming && weapon.transform.localPosition.normalized != defaultPos.normalized)
{
weapon.transform.localPosition = Vector3.SmoothDamp (weapon.transform.localPosition, defaultPos, ref dampVelocity, smoothTime);
Debug.Log ("UnAiming");
recoil = defaultRecoil;
}
}
void OnGUI() { GUILayout.Label("Ammo: " + ammoInClip + "/" + curAmmo); } }
Answer by Jeezker · Apr 22, 2019 at 11:44 PM
float LastTimeShot;
float TimeBetweenShots = 1; //for example
shoot() method:
-if (Time.time < LastTimeShot + timeBetweenShots) return;
-do the shooting
-LastTimeShot = Time.time
if (Input.Get$$anonymous$$ouseButtonDown(0) && !isReloading){
Shoot(); <-- here you need this modification
}