// Update is called once per frame
    void FixedUpdate()
    {
        if (Physics2D.OverlapCircle(gameObject.transform.position, range, playerLayer))
        {
            collisionEffect.SetActive(true);
            laserLine.enabled = true;

            targetPosition = target.transform.position;

            if (!isFiring && !isPaused) // aim
            {
                laserOrigin          = laserOriginPoint.transform.position;
                laserOriginDirection = new Vector2(targetPosition.x - laserOrigin.x, targetPosition.y - laserOrigin.y);
                laserAngle           = Mathf.Atan2(laserOriginDirection.y, laserOriginDirection.x);
                if (laserAngle < 0f)
                {
                    laserAngle = Mathf.PI * 2 + laserAngle;
                }
                gameObject.transform.up = Quaternion.Euler(0, 0, (laserAngle * Mathf.Rad2Deg) + 90f) * Vector2.right;
                laserOriginDirection.Normalize();
            }

            RaycastHit2D laser = Physics2D.Raycast(laserOrigin, laserOriginDirection, laserRange, laserLayer);
            if (laser.collider != null)
            {
                laserEndpoint = laser.point;
                collisionEffect.SetActive(true);

                laserLine.positionCount = 2;
                laserLine.SetPosition(0, laserOrigin);
                laserLine.SetPosition(1, laserEndpoint);

                Vector2 laserCollisionNormal = laser.normal;
                float   collisionNormalAngle = Mathf.Atan2(laserCollisionNormal.y, laserCollisionNormal.x);
                if (collisionNormalAngle < 0f)
                {
                    collisionNormalAngle = Mathf.PI * 2 + collisionNormalAngle;
                }

                if (playerScript.partConfiguration == 1 && laser.collider.tag == "Player")
                {
                    collisionEffect.transform.up = Quaternion.Euler(0, 0, (laserAngle * Mathf.Rad2Deg) + 180f) * Vector2.right;
                }
                else
                {
                    collisionEffect.transform.up = Quaternion.Euler(0, 0, (collisionNormalAngle * Mathf.Rad2Deg)) * Vector2.right;
                }

                if (laser.collider.tag == "Player") // if hitting the player and they do not have the deflector shield
                {
                    collisionEffect.transform.position = targetPosition;
                    if (laserTag != "Player") // if it wasn't previously hitting the player
                    {
                        playerScript.DeathRay(false);
                        playerScript.EndDeflect();
                    }
                    if (isFiring)
                    {
                        if (!killedPlayer)
                        {
                            playerScript.Die(0.4f);
                            killedPlayer = true;
                        }
                    }
                    else if (!isPaused)
                    {
                        isCharging = true;
                    }
                }
                else if (laser.collider.tag == "powerCell")
                {
                    if (laserTag != "powerCell" && isFiring || (isFiring && !wasFiring))
                    {
                        powerCell           = laser.transform.gameObject.GetComponent <powerCell>();
                        powerCell.activated = true;
                    }
                }
                else if (laser.collider.tag == "HeldBox")
                {
                    collisionEffect.transform.position = laser.point;
                    if (laserTag != "HeldBox" && isFiring || (isFiring && !wasFiring))
                    {
                        if (playerScript.heldBoxTag == "powerCell")
                        {
                            powerCell powerCell = target.transform.Find("PowerCell").GetComponent <powerCell>();
                            Debug.Log(powerCell);
                            powerCell.activated = true;
                        }
                    }
                }
                else if (laser.collider.tag == "Shield") // if it hits the player's force field shield
                {
                    collisionEffect.transform.position = laser.point;
                    if (laserTag != "Shield")
                    {
                        playerScript.InitiateDeflect();
                        laserChargeTimer = 0f;

                        if (isFiring == true)
                        {
                            playerScript.DeathRay(true);
                        }
                        else
                        {
                            playerScript.DeathRay(false);
                            if (!isPaused)
                            {
                                isCharging = true;
                            }
                        }
                    }
                }
                else if (laser.collider.tag == "LaserRouter") // if it hits a laser router
                {
                    if (laserTag != "laserRouter")
                    {
                        laserRouter = laser.transform.gameObject.GetComponent <laserRouter>();
                        laserRouter.Charged();
                        if (isFiring == true)
                        {
                            laserRouter.DeathRay(true);
                        }
                        else
                        {
                            laserRouter.DeathRay(false);
                        }
                    }
                }
                else
                {
                    if (laserRouter != null && laserTag == "laserRouter")
                    {
                        laserRouter.Drained();
                        laserRouter.DeathRay(false);
                    }

                    if (laserTag == "Shield")
                    {
                        playerScript.DeathRay(false);
                        playerScript.EndDeflect();
                    }

                    isCharging = false;

                    if (laser.collider.tag == "Box" || laser.collider.tag == "Enemy")
                    {
                        collisionEffect.transform.position = laser.collider.transform.position;
                    }
                    else
                    {
                        collisionEffect.transform.position = laser.point;
                    }
                }

                if (laserTag != laser.collider.tag)
                {
                    if (laserTag == "Shield")
                    {
                        playerScript.DeathRay(false);
                        playerScript.EndDeflect();
                    }
                }
                laserTag = laser.collider.tag;
                collisionEffect.transform.position = laser.point;
            }
            else
            {
                if (laserTag == "Shield")
                {
                    playerScript.DeathRay(false);
                    playerScript.EndDeflect();
                }
                laserTag = "null";
                collisionEffect.SetActive(false);
            }
        }
        else
        {
            if (laserTag == "Shield")
            {
                playerScript.DeathRay(false);
                playerScript.EndDeflect();
                laserTag = "null";
            }
            isCharging = false;
            collisionEffect.SetActive(false);
            laserLine.enabled = false;
            laserChargeTimer  = 0;
            // Unwind
            //if(laserChargeTimer > 0) laserChargeTimer -= 2f * Time.deltaTime;
            //if(laserChargeTimer <= 0) laserChargeTimer = 0f;
        }


        wasFiring = isFiring;


        if (isCharging)
        {
            if (!wasCharging)
            {
                AkSoundEngine.PostEvent("BansheeWindUp", gameObject);
            }
            laserLine.material = materialCharge;
            laserChargeTimer  += Time.deltaTime;

            burstColour.ColourChange("blue");
            collisionColour.ColourChange("blue");

            if (laserChargeTimer >= laserChargeTime)
            {
                laserTag           = "null";
                laserLine.material = materialPause;
                laserPauseTimer    = 0f;
                isPaused           = true;
                isCharging         = false;
                burstColour.ColourChange("purple");
                collisionColour.ColourChange("purple");
            }
        }
        else
        {
            laserChargeTimer = 0f;
        }

        wasCharging = isCharging;

        if (isPaused)
        {
            laserPauseTimer += Time.deltaTime;
            if (laserPauseTimer >= laserPauseTime)
            {
                laserTag           = "null";
                laserLine.material = materialFire;
                laserFireTimer     = 0f;
                isFiring           = true;
                isPaused           = false;
                AkSoundEngine.PostEvent("BansheeFire", gameObject);
            }
        }

        if (isFiring)
        {
            isPaused         = false;
            laserChargeTimer = 0f;
            laserFireTimer  += Time.deltaTime;

            if (laserFireTimer > laserFireTime)
            {
                laserTag           = "null";
                laserLine.material = materialCharge;
                isFiring           = false;
                laserFireTimer     = 0f;
                killedPlayer       = false;
                burstColour.ColourChange("blue");
                collisionColour.ColourChange("blue");
            }

            float laserAngle = Mathf.Atan2(laserOriginDirection.y, laserOriginDirection.x);  // apply the laser burst effect
            if (laserAngle < 0f)
            {
                laserAngle = Mathf.PI * 2 + laserAngle;
            }

            burstEffect.SetActive(true);
            burstColour.ColourChange("red");
            collisionColour.ColourChange("red");
            collisionEffect.transform.localScale = Vector3.one;
            burstEffect.transform.position       = laserOrigin;
            burstEffect.transform.up             = Quaternion.Euler(0, 0, (laserAngle * Mathf.Rad2Deg)) * Vector2.right;
        }
        else
        {
            burstEffect.SetActive(false);
            collisionEffect.transform.localScale = new Vector3(0.6f, 0.6f, 1f);
        }

        if (!isCharging && !isFiring && !isPaused)
        {
            unFocussed = true;
            if (!wasUnFocussed)
            {
                AkSoundEngine.PostEvent("BansheeStop", gameObject);
                burstColour.ColourChange("blue");
                collisionColour.ColourChange("blue");
            }
        }
        else
        {
            unFocussed = false;
        }

        wasUnFocussed = unFocussed;
    }