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; } }
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; } }
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); } } } }
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); } } } }