// Use this for initialization
    void Start()
    {
        mainCamera     = transform.Find("Main Camera").gameObject;
        ammoUI         = GameObject.FindWithTag("Ammo UI").GetComponent <AmmoUIController>();
        gameController = GameObject.FindWithTag("GameController").GetComponent <GameController>();
        bulletTimerUI  = GameObject.FindWithTag("Bullet Timer").GetComponent <BulletTimer>();

        currWeaponSlotHeld = 1;
        gunController      = mainCamera.transform.Find("Weapon Slot " + currWeaponSlotHeld).GetChild(0).GetComponent <GunController>();

        ammoUI.setAmmoCount(gunController.currAmmoInClip, gunController.currSpareAmmo);
    }
    void SwapWeapons(int weaponSlot)
    {
        if (!mainCamera.transform.Find("Weapon Slot " + weaponSlot).GetChild(0))
        {
            // Must not have a gun in the specified weapon slot. Don't swap.
            return;
        }

        if (gunController.zoomedIn)
        {
            StartCoroutine(gunController.Zoom());
        }

        // Set current held weapon model to inactive.
        gunController.canFire = true;    // Indicates to current gunController to cancel reload.
        gunController.animations.Stop(); // Stop any animations, particularly bullet chambering animations.
        mainCamera.transform.Find("Weapon Slot " + currWeaponSlotHeld).GetChild(0).GetChild(0).gameObject.SetActive(false);

        Transform newWeapon = mainCamera.transform.Find("Weapon Slot " + weaponSlot).GetChild(0);

        // Set the new weapon model to active.
        newWeapon.GetChild(0).gameObject.SetActive(true);

        // Get reference to gunController for new weapon and reset transform.
        gunController = newWeapon.GetComponent <GunController>();
        gunController.resetTransform();
        currWeaponSlotHeld = weaponSlot;

        // Update UI.
        ammoUI.setAmmoCount(gunController.currAmmoInClip, gunController.currSpareAmmo);
        if (gunController.currAmmoInClip > 0)
        {
            StartCoroutine(bulletTimerUI.RunTimer(0.0f, "full"));
        }
        else
        {
            StartCoroutine(bulletTimerUI.RunTimer(0.0f, "empty"));
        }
    }
    public void Fire()
    {
        if (currAmmoInClip > 0)
        {
            if (attachedToPlayer)
            {
                applyRecoil(recoilAmount, recoilYBias);
            }

            gunSounds.PlayOneShot(gunFireSound, gunFireVolume);
            animations.Play(gameObject.name + " Shot");

            // If last bullet is being fired, don't do chamber bullet animation nor play .
            if (currAmmoInClip != 1)
            {
                if (chamberBullet)
                {
                    StartCoroutine(ChamberBullet());
                }

                if (attachedToPlayer)
                {
                    StartCoroutine(bulletTimerUI.RunTimer(firePause));
                }
            }
            else if (attachedToPlayer)
            {
                StartCoroutine(bulletTimerUI.RunTimer(firePause, "empty"));
            }


            RaycastHit hit;
            if (Physics.Raycast(transform.parent.parent.position, transform.up, out hit))
            {
                if (ammoType.Equals("bullet"))
                {
                    if (hit.collider.gameObject.CompareTag("Enemy"))
                    {
                        Health health = hit.collider.gameObject.transform.parent.GetComponent <Health>();
                        health.TakeDamage(damage);
                    }
                }
                else if (ammoType.Equals("object"))
                {
                    if (hit.collider.gameObject.CompareTag("Ground"))
                    {
                        Instantiate(objectToSpawn, hit.point, Quaternion.identity);
                    }
                }
            }

            currAmmoInClip -= 1;
            nextFire        = Time.time + firePause;

            if (attachedToPlayer)
            {
                ammoUI.setAmmoCount(currAmmoInClip, currSpareAmmo);
            }
        }
        else
        {
            // Clip must be empty. Play appropriate sound.
            gunSounds.PlayOneShot(emptyGunSound, emptyGunVolume);

            // Prevent the spamming of the emptyGunSound sound effect.
            nextFire = Time.time + firePause;
        }
    }
    void buyAmmo()
    {
        // Check that player has the relevant gun.
        Transform mainCamera = GameObject.FindWithTag("Player").transform.Find("Main Camera");
        Transform gunSlot;
        int       i;

        for (i = 0; i < mainCamera.childCount; i++)
        {
            gunSlot = mainCamera.GetChild(i);
            if (gunSlot.childCount > 0 && gunSlot.GetChild(0).gameObject.name.Equals(gunName))
            {
                // Player has the relevant gun.

                // Only buy ammo if the player has enough money.
                if (gameController.money >= ammoCost)
                {
                    GunController gunController = gunSlot.GetChild(0).gameObject.GetComponent <GunController>();
                    ammoBefore = gunController.currSpareAmmo;
                    gunController.currSpareAmmo = Mathf.Clamp(gunController.currSpareAmmo + ammoAmount,
                                                              0,
                                                              gunController.maxSpareAmmo + gunController.magazineSize - gunController.currAmmoInClip);

                    // If the player is currently holding the gun, update the ammo count on the UI.
                    if (gunSlot.GetChild(0).GetChild(0).gameObject.activeSelf)
                    {
                        ammoUI.setAmmoCount(gunController.currAmmoInClip, gunController.currSpareAmmo);
                    }

                    // Update the player's money and update the UI.
                    // Only charge for the ammo that the player actually gains.
                    moneyController.changeMoneyText(-ammoCost * (gunController.currSpareAmmo - ammoBefore) / ammoAmount);

                    // Play the buy sound only if ammo was actually bought.
                    if (ammoBefore < gunController.currSpareAmmo)
                    {
                        shopAudioSource.PlayOneShot(buySound, buySoundVolume);
                    }
                    else
                    {
                        // No ammo was bought.
                        PlayDenySound();
                    }
                }
                else
                {
                    // Player does not have enough money to buy ammo.
                    PlayDenySound();
                }

                // Relevant gun was found. Stop searching.
                break;
            }
        }

        if (i == mainCamera.childCount)
        {
            // Player did not have the relevant gun.
            PlayDenySound();
        }
    }