// Aiming perform
 private void HandleAiming()
 {
     // Aim input
     if (InputHandler.AimKeyHeld() && CanAim())
     {
         if (aimingProgress < weaponData.maxAimingProgress)
         {
             aimingProgress += CommonUtil.GetStepUpdate();
         }
     }
     else
     {
         if (aimingProgress > 0)
         {
             aimingProgress -= CommonUtil.GetStepUpdate();
         }
     }
     aimingProgress = Mathf.Clamp(aimingProgress, 0, weaponData.maxAimingProgress);
     // Aim cam zoom and weapon move
     AnimateAiming();
 }
    void Update()
    {
        // Add some velocity
        veloctiy -= gravity * Time.deltaTime;

        // Ground check
        if (Physics.CheckSphere(groundCheckTransform.position, groundCheckDistance, groundMask))
        {
            isGrounded = true;
            veloctiy   = 0;
        }

        // Camera Input
        float mouseX = InputHandler.GetViewHorizontalAxis();
        float mouseY = -InputHandler.GetViewVerticalAxis();

        // Aiming
        if (InputHandler.AimKeyHeld())
        {
            aimValue = Mathf.Clamp(aimValue + CommonUtil.GetStepUpdate(), 0, maxAimValue);
        }
        else
        {
            aimValue = Mathf.Clamp(aimValue - CommonUtil.GetStepUpdate(), 0, maxAimValue);
        }
        mainCamera.transform.position = transform.position + mainCamera.transform.rotation * cameraRelative * (1 - maxAimMultiplier * aimValue / maxAimValue);

        // Shoot
        if (InputHandler.FireKeyHeld())
        {
            weaponData.TryShoot(mainCamera.transform);
        }

        // Rotation
        transform.RotateAround(this.transform.position, Vector3.up, mouseX);
        mainCamera.transform.RotateAround(this.transform.position, mainCamera.transform.right, mouseY);

        // Player Input
        float horizontal = InputHandler.GetHorizontalAxis();
        float vertical   = InputHandler.GetVerticalAxis();

        // Player rotate with camera
        transform.Rotate(new Vector3(0, mouseX, 0), Space.Self);

        // Flat movement speed calculation
        float spdLimiter = walkSpeed;

        if (InputHandler.SprintKeyHeld())
        {
            spdLimiter = runningSpeed;
        }
        else if (horizontal == 0 && vertical == 0)
        {
            spdLimiter = 0;
        }
        else if (vertical < 0)
        {
            spdLimiter = -walkSpeed;
        }
        currentSpeed = TweenLerpUtil.SpeedLerp(currentSpeed, spdLimiter, speedAcceleration);

        // === Player Jump ===
        if (InputHandler.JumpKeyDown() && isGrounded)
        {
            isGrounded = false;
            veloctiy  += initialJumpVelocity;
        }
        characterController.Move(veloctiy * Time.deltaTime * this.transform.up);

        // Apply motion
        Vector3 motion = transform.forward * vertical + transform.right * horizontal;

        motion.Normalize();
        motion = motion * Mathf.Abs(currentSpeed) * Time.deltaTime;

        // Apply movement
        characterController.Move(motion);

        // Apply animation
        animator.SetFloat("motionSpeed", currentSpeed);
        animator.SetFloat("jumpSpeed", veloctiy);
        animator.SetBool("isGrounded", isGrounded);
    }