private void Update()
    {
        // Checking for WaterDetector
        if (_waterDetector == null)
        {
            _waterDetector = GetComponent <WaterDetector>() ?? gameObject.AddComponent <WaterDetector>();
        }

        // If we are in the water
        if (_waterDetector != null)
        {
            _controller            = GetComponent <CharacterController>();
            _thirdPersonController = GetComponent <DW_ThirdPersonController>();

            // If we are actually submerged to a some extent
            float waterLevel = _waterDetector.GetWaterLevel(transform.position);

            float min = _controller.bounds.center.y;
            float max = _controller.bounds.center.y + _controller.height / 2f;
            // Assume we are submerged when the character is at least half in the water.
            _isSubmerged = (min <waterLevel && max> waterLevel) || (min < waterLevel && max < waterLevel);
            // 1 when fully submerged, 0 when half submerged
            float submergedCoeff = Mathf.Clamp01((waterLevel - min) / (max - min));

            // Setting the speeds
            if (_isSubmerged)
            {
                float smoothSlowdownFactor = Mathf.Lerp(1f, UnderwaterSpeedFactor, submergedCoeff);

                _thirdPersonController.Gravity               = _initGravity * smoothSlowdownFactor;
                _thirdPersonController.WalkSpeed             = _initWalkSpeed * smoothSlowdownFactor;
                _thirdPersonController.RunSpeed              = _initRunSpeed * smoothSlowdownFactor;
                _thirdPersonController.TrotSpeed             = _initTrotSpeed * smoothSlowdownFactor;
                _thirdPersonController.walkMaxAnimationSpeed = _initWalkAnimationSpeed * smoothSlowdownFactor;
                _thirdPersonController.runMaxAnimationSpeed  = _initRunMaxAnimationSpeed * smoothSlowdownFactor;
                _thirdPersonController.jumpAnimationSpeed    = _initJumpAnimationSpeed * smoothSlowdownFactor;
                _thirdPersonController.landAnimationSpeed    = _initLandAnimationSpeed * smoothSlowdownFactor;
                _thirdPersonController.trotMaxAnimationSpeed = _initTrotAnimationSpeed * smoothSlowdownFactor;
            }
            else
            {
                _thirdPersonController.Gravity               = _initGravity;
                _thirdPersonController.WalkSpeed             = _initWalkSpeed;
                _thirdPersonController.RunSpeed              = _initRunSpeed;
                _thirdPersonController.TrotSpeed             = _initTrotSpeed;
                _thirdPersonController.walkMaxAnimationSpeed = _initWalkAnimationSpeed;
                _thirdPersonController.runMaxAnimationSpeed  = _initRunMaxAnimationSpeed;
                _thirdPersonController.jumpAnimationSpeed    = _initJumpAnimationSpeed;
                _thirdPersonController.landAnimationSpeed    = _initLandAnimationSpeed;
                _thirdPersonController.trotMaxAnimationSpeed = _initTrotAnimationSpeed;
            }
        }
    }
    private void Update()
    {
        // Checking for WaterDetector
        if (_waterDetector == null)
        {
            _waterDetector = GetComponent <WaterDetector>() ?? gameObject.AddComponent <WaterDetector>();
        }

        // If we are in the water
        if (_waterDetector != null)
        {
            _controller            = GetComponent <CharacterController>();
            _thirdPersonController = GetComponent <DW_ThirdPersonController>();

            // If we are actually submerged to a some extent
            float waterLevel = _waterDetector.GetWaterLevel(transform.position);

            float min = _controller.bounds.center.y;
            float max = _controller.bounds.center.y + _controller.height / 2f;

            // Assume we can swim when at least half submerged into water
            _isSubmerged = (min <waterLevel && max> waterLevel) || (min < waterLevel && max < waterLevel);

            // Value of 1 means fully submerged, value of 0 means not submerged
            float submergedCoeff = Mathf.Clamp01((waterLevel - min) / (max - min));

            if (_isSubmerged)
            {
                bool flag = Input.GetKey(SwimUpKey);
                if (flag)
                {
                    _thirdPersonController.VerticalSpeed = 0f;
                }

                // Swimming u
                if (Input.GetKey(SwimUpKey))
                {
                    _controller.Move(Vector3.up * SwimSpeed * submergedCoeff * Time.deltaTime);
                }
            }
        }
    }