Mouse Look and Audio

Hello i am making a third person top down game, but there is a problem wth my scripts when i move my mouse my character doesnt follow correctly also when i shoot my gun its sounds like the audio is being repeated. Thanks in Advance

Camera

using UnityEngine;
using System.Collections;

public class GameCamera : MonoBehaviour {

private Vector3 cameraTarget;

private Transform target;

void Start () {
    target = GameObject.FindGameObjectWithTag("Player").transform;
}

void Update () {
    cameraTarget = new Vector3(target.position.x,transform.position.y,target.position.z);
    transform.position = Vector3.Lerp(transform.position,cameraTarget,Time.deltaTime * 8);
}

}

Gun

using UnityEngine;
using System.Collections;

[RequireComponent (typeof (AudioSource))]
public class Gun : MonoBehaviour {

public enum GunType { Semi, Burst, Auto };
public GunType gunType;
public float rpm;

// Components
public Transform spawn;
private LineRenderer tracer;

// System:
private float secondsBetweenShots;
private float nextPossibleShootTime;

void Start() {
    secondsBetweenShots = 60 / rpm;
    if (GetComponent<LineRenderer>())        {
        tracer = GetComponent<LineRenderer>();
    }
}

public void Shoot()  {

    if (CanShoot())
    {
        Ray ray = new Ray(spawn.position, spawn.forward);
        RaycastHit hit;

        float shotDistance = 20;

        if (Physics.Raycast(ray, out hit, shotDistance))
        {
            shotDistance = hit.distance;
        }

        nextPossibleShootTime = Time.time + secondsBetweenShots;

        GetComponent<AudioSource>().Play();

        if (tracer)  {
            StartCoroutine("RenderTracer", ray.direction * shotDistance);
        }
    }

}

public void ShootContinuous()  {
    if (gunType == GunType.Auto) {
        Shoot ();
    }
}

private bool CanShoot() {
    bool canShoot = true;

    if (Time.time < nextPossibleShootTime) {
        canShoot = false;
    }

    return canShoot;
}

IEnumerator RenderTracer(Vector3 hitPoint)    {
    tracer.enabled = true;
    tracer.SetPosition(0, spawn.position);
    tracer.SetPosition(1, spawn.position + hitPoint);

    yield return null;
    tracer.enabled = false;
}

}

Player Controller

using UnityEngine;
using System.Collections;
using System;

[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{

public float rotationSpeed = 450;
public float walkSpeed = 5;
public float runSpeed = 8;

// System
private Quaternion targetRotation;

// Components 
public Gun gun;
private CharacterController controller;
private Camera cam;

void Start()
{
    controller = GetComponent<CharacterController>();
    cam = Camera.main;
}

void Update()
{
    ControlMouse();
    //ControlWASD();

    if (Input.GetButtonDown("Shoot")) {
        gun.Shoot();
    }
    else if (Input.GetButton("Shoot")) {
        gun.ShootContinuous();
    }
}

void ControlMouse()
{

    Vector3 mousePos = Input.mousePosition;
    mousePos = cam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, cam.transform.position.y - transform.position.y));
    targetRotation = Quaternion.LookRotation(mousePos);
    transform.eulerAngles = Vector3.up * Mathf.MoveTowardsAngle(transform.eulerAngles.y, targetRotation.eulerAngles.y, rotationSpeed * Time.deltaTime);

    Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
    Vector3 motion = input;
    motion *= (Mathf.Abs(input.x) == 1 && Mathf.Abs(input.z) == 1) ? .7f : 1;
    motion *= (Input.GetButton("Run")) ? runSpeed : walkSpeed;
    motion += Vector3.up * -8;

    controller.Move(motion * Time.deltaTime);

}

void ControlWASD()
{
    Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));

    if (input != Vector3.zero)
    {
        targetRotation = Quaternion.LookRotation(input);
        transform.eulerAngles = Vector3.up * Mathf.MoveTowardsAngle(transform.eulerAngles.y, targetRotation.eulerAngles.y, rotationSpeed * Time.deltaTime);
    }

    Vector3 motion = input;
    motion *= (Mathf.Abs(input.x) == 1 && Mathf.Abs(input.z) == 1) ? .7f : 1;
    motion *= (Input.GetButton("Run")) ? runSpeed : walkSpeed;
    motion += Vector3.up * -8;

    controller.Move(motion * Time.deltaTime);
}

}

I also made a video showing my problem : - YouTube

Thank you

Bump?? Anyone?