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 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;
            }
        }
    }
    protected void FixedUpdate()
    {
        // Checking for WaterDetector
        if (_waterDetector == null)
        {
            _waterDetector = GetComponent <WaterDetector>() ?? gameObject.AddComponent <WaterDetector>();
        }

        // If we are in the water
        if (_waterDetector.Water != null)
        {
            IDynamicWaterSettings water = _waterDetector.Water as IDynamicWaterSettings;
            if (water == null)
            {
                return;
            }

            _controller = GetComponent <CharacterController>();

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

            float min = _controller.bounds.center.y - _controller.height / 2f;
            float max = _controller.bounds.center.y + _controller.height / 2f;
            _isSubmerged = min <waterLevel && max> waterLevel;

            // Do not make ripples while standing
            if (_controller.velocity.sqrMagnitude > 0.5f && _isSubmerged)
            {
                water.CreateSplash(transform.position, SplashRadius, SplashForce * Time.deltaTime);
            }

            // Checking if we must make a splash
            if (_splashAllowed && _isSubmerged && _isSubmerged != _isSubmergedPrev && !_controller.isGrounded && _controller.velocity.y < -SplashThreshold)
            {
                SpawnSplash(JumpSplashPrefab, water.PlaneCollider.ClosestPointOnBounds(transform.position));
                water.CreateSplash(transform.position, JumpSplashRadius, JumpSplashForce);

                // To make sure we are not making splashes too often
                _splashAllowed = false;
                StartCoroutine(AllowSplash());
            }

            _isSubmergedPrev = _isSubmerged;
        }
    }
Пример #4
0
    private void OnTriggerExit(Collider other)
    {
        if (disableGravityScale)
        {
            GravityScale gravity = other.GetComponent <GravityScale>();
            if (gravity != null)
            {
                gravity.enabled = true;
            }
        }

        WaterDetector water = other.GetComponent <WaterDetector>();

        if (water != null)
        {
            water.isUnderWater = false;
        }
    }
Пример #5
0
    protected void FixedUpdate() {
        // Checking for WaterDetector
        if (_waterDetector == null) {
            _waterDetector = GetComponent<WaterDetector>() ?? gameObject.AddComponent<WaterDetector>();
        }

        // If we are in the water
        if (_waterDetector.Water != null) {
            IDynamicWaterSettings water = _waterDetector.Water as IDynamicWaterSettings;
            if (water == null) {
                return;
            }

			_controller = GetComponent<CapsuleCollider>();
			_vController = GetComponent<Rigidbody>();
			bool isGrounded = GetComponent<ThirdPersonCharacter>().m_IsGrounded;

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

            float min = _controller.bounds.center.y - _controller.height / 2f;
            float max = _controller.bounds.center.y + _controller.height / 2f;
            _isSubmerged = min < waterLevel && max > waterLevel;

            // Do not make ripples while standing
			if (_vController.velocity.sqrMagnitude > 0.5f && _isSubmerged) {
                water.CreateSplash(transform.position, SplashRadius, SplashForce * Time.deltaTime);
            }

            // Checking if we must make a splash 
			if (_splashAllowed && _isSubmerged && _isSubmerged != _isSubmergedPrev && !isGrounded && _vController.velocity.y < -SplashThreshold) {
                SpawnSplash(JumpSplashPrefab, water.PlaneCollider.ClosestPointOnBounds(transform.position));
                water.CreateSplash(transform.position, JumpSplashRadius, JumpSplashForce);

                // To make sure we are not making splashes too often
                _splashAllowed = false;
                StartCoroutine(AllowSplash());
            }

            _isSubmergedPrev = _isSubmerged;
        }
    }
    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);
                }
            }
        }
    }
Пример #7
0
    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);
                }
            }
        }
    }