unity shooting script
using UnityEngine;
public class Gun : MonoBehaviour {
public enum ShootState {
Ready,
Shooting,
Reloading
}
// How far forward the muzzle is from the centre of the gun
private float muzzleOffset;
[Header("Magazine")]
public GameObject round;
public int ammunition;
[Range(0.5f, 10)] public float reloadTime;
private int remainingAmmunition;
[Header("Shooting")]
// How many shots the gun can make per second
[Range(0.25f, 25)] public float fireRate;
// The number of rounds fired each shot
public int roundsPerShot;
[Range(0.5f, 100)] public float roundSpeed;
// The maximum angle that the bullet's direction can vary,
// in both the horizontal and vertical axes
[Range(0, 45)] public float maxRoundVariation;
private ShootState shootState = ShootState.Ready;
// The next time that the gun is able to shoot at
private float nextShootTime = 0;
void Start() {
muzzleOffset = GetComponent<Renderer>().bounds.extents.z;
remainingAmmunition = ammunition;
}
void Update() {
switch(shootState) {
case ShootState.Shooting:
// If the gun is ready to shoot again...
if(Time.time > nextShootTime) {
shootState = ShootState.Ready;
}
break;
case ShootState.Reloading:
// If the gun has finished reloading...
if(Time.time > nextShootTime) {
remainingAmmunition = ammunition;
shootState = ShootState.Ready;
}
break;
}
}
/// Attempts to fire the gun
public void Shoot() {
// Checks that the gun is ready to shoot
if(shootState == ShootState.Ready) {
for(int i = 0; i < roundsPerShot; i++) {
// Instantiates the round at the muzzle position
GameObject spawnedRound = Instantiate(
round,
transform.position + transform.forward * muzzleOffset,
transform.rotation
);
// Add a random variation to the round's direction
spawnedRound.transform.Rotate(new Vector3(
Random.Range(-1f, 1f) * maxRoundVariation,
Random.Range(-1f, 1f) * maxRoundVariation,
0
));
Rigidbody rb = spawnedRound.GetComponent<Rigidbody>();
rb.velocity = spawnedRound.transform.forward * roundSpeed;
}
remainingAmmunition--;
if(remainingAmmunition > 0) {
nextShootTime = Time.time + (1 / fireRate);
shootState = ShootState.Shooting;
} else {
Reload();
}
}
}
/// Attempts to reload the gun
public void Reload() {
// Checks that the gun is ready to be reloaded
if(shootState == ShootState.Ready) {
nextShootTime = Time.time + reloadTime;
shootState = ShootState.Reloading;
}
}
}