void Update()
    {
        delayAnimationMove  -= Time.deltaTime;
        delayAnimationShoot -= Time.deltaTime;

        if (delayAnimationMove < 0f && delayAnimationShoot < 0f)
        {
            sprite = spriteMove[0];
        }

        delayJump  -= Time.deltaTime;
        delayShoot -= Time.deltaTime;

        float offset = 0f;

        isUp     = Input.GetKey(KeyCode.W);
        isCrouch = Input.GetKey(KeyCode.S);
        isShoot  = Input.GetKey(KeyCode.K) && delayShoot < 0f;

        if (Input.GetKey(KeyCode.A))
        {
            offset = -speed * Time.deltaTime;
            drt    = 0;
        }
        else if (Input.GetKey(KeyCode.D))
        {
            offset = speed * Time.deltaTime;
            drt    = 1;
        }

        float velocity = Mathf.Clamp((rb.velocity.x + offset) * 0.9f, -6f, 6f);

        rb.velocity = new Vector2(velocity, rb.velocity.y);

        if (velocity > 0.5f || velocity < -0.5f)
        {
            if (delayAnimationMove < 0f && delayAnimationShoot < 0f)
            {
                delayAnimationMove = 0.1f;
                stateMove++;
                if (stateMove == 4)
                {
                    stateMove = 0;
                }
                sprite = spriteMove[stateMove];
            }
        }
        transform.localScale = localScale[drt];

        if (isJump && rb.velocity.y < -0.1f)
        {
            isFall = true;
        }

        jumpState = -1;
        if (Input.GetKey(KeyCode.J))
        {
            jumpState = 0;
        }
        else if (Input.GetKey(KeyCode.L))
        {
            jumpState = 1;
        }

        if (IsGrounded())
        {
            if (isUp && PortalManager.IsInPortal(transform.position))
            {
                Instantiate(playerPortal, transform.position, Quaternion.identity);
                Destroy(gameObject);
                SoundEffect.PlayPortal();
                return;
            }
            isJump = false;
            var pos = Unstable.tilemap.WorldToCell(transform.position - Vector3.up * 0.3f);
            pos.y -= 1;
            if (jumpState == 1 && isFall && isCrouch)
            {
                if (pos.x != currentTileX || pos.y != currentTileY)
                {
                    currentTileX = pos.x;
                    currentTileY = pos.y;
                    jumpLow      = 3;
                }
                else
                {
                    jumpLow--;
                    if (jumpLow == 0)
                    {
                        currentTileY = -99;
                        Unstable.DestroyTile(pos);
                    }
                }
            }
            if (delayJump < 0f && jumpState > -1)
            {
                isJump      = true;
                delayJump   = 0.1f;
                rb.velocity = new Vector2(rb.velocity.x, jumpVelocity[jumpState]);
                SoundEffect.PlayJump();
            }
            isFall = false;
        }
        else
        {
            isJump = true;
        }

        if (isJump && delayAnimationShoot < 0f)
        {
            sprite             = spriteJump;
            delayAnimationMove = 0.1f;
        }

        if (isCrouch)
        {
            sprite = spriteCrouch;
        }

        if (isShoot)
        {
            if (isCrouch)
            {
                sprite = spriteCrouch;
                if (StoneManager.stone > 0)
                {
                    delayShoot = 0.3f;
                    Vector3 pos;
                    if (isJump)
                    {
                        pos = transform.position - Vector3.up * 1.5f;
                    }
                    else
                    {
                        pos = transform.position - Vector3.up * 0.5f + offsetHorizontal[drt];
                    }
                    if (Unstable.CreateStone(pos))
                    {
                        StoneManager.ReloadStone(-1);
                    }
                }
            }
            else
            {
                delayShoot = 0.4f;
                sprite     = spriteShoot;
                if (isUp)
                {
                    Instantiate(bulletUp, transform.position + Vector3.up * 0.6f + offsetHorizontal[drt] * 0.4f, Quaternion.identity);
                }
                else
                {
                    GameObject obj = Instantiate(bullet, transform.position + Vector3.up * 0.34f + offsetHorizontal[drt] * 0.43f, Quaternion.identity);
                    obj.transform.localScale = localScale[drt];
                    obj.GetComponent <BulletController>().direction = offsetHorizontal[drt];
                }
                SoundEffect.PlayShoot();
            }
            delayAnimationShoot = 0.2f;
        }
        spriteRenderer.sprite = sprite;

        if (!isImmune)
        {
            if (Physics2D.OverlapBox(box.bounds.center, box.bounds.size, 0f, layerEnemy) != null)
            {
                LostHp(1);
            }
        }
        else
        {
            delayAnimationImmune -= Time.deltaTime;
            if (delayAnimationImmune < 0f)
            {
                delayAnimationImmune = 0.025f;
                isShowSprite         = !isShowSprite;
            }

            if (!isShowSprite)
            {
                spriteRenderer.sprite = null;
            }

            timerImmune -= Time.deltaTime;
            if (timerImmune < 0f)
            {
                isImmune = false;
            }
        }

        if (transform.position.y < -8.5f)
        {
            LostHp(HpManager.hp);
        }

        if (!isCameraBoss && transform.position.x >= posBossActive)
        {
            isCameraBoss = true;
            Instantiate(cameraBoss);
        }
        ReloadCamera();
    }