void FixedUpdate() { // Get current head position float currentHeight = head.localPosition.y; if (IsKeyPressed(keys)) { // Crouch down float minHeight = defaultHeadYLocalPosition - crouchYLocalPosition; // Enforce crouched y local position animation of the head. if (minHeight < currentHeight) { head.localPosition = new Vector3(head.localPosition.x, head.localPosition.y - 0.1f, head.localPosition.z); } // Lower the capsule collider. if (capsuleCollider) { capsuleCollider.height = defaultCapsuleColliderHeight - (defaultHeadYLocalPosition - crouchYLocalPosition); capsuleCollider.center = Vector3.up * capsuleCollider.height * .5f; } // Set state. if (!isCrouched) { isCrouched = true; CrouchStart?.Invoke(); } } else { // Will the Real Slim Shady please stand up? float maxHeight = defaultHeadYLocalPosition; // Reset the head to its default y local position. if (currentHeight < maxHeight) { head.localPosition = new Vector3(head.localPosition.x, head.localPosition.y + 0.1f, head.localPosition.z); } // Reset the capsule collider's position. if (capsuleCollider) { capsuleCollider.height = defaultCapsuleColliderHeight; capsuleCollider.center = Vector3.up * capsuleCollider.height * .5f; } // Reset state. isCrouched = false; CrouchEnd?.Invoke(); } }
void LateUpdate() { if (Input.GetKey(key)) { // Enforce crouched y local position of the head. head.localPosition = new Vector3(head.localPosition.x, crouchYLocalPosition, head.localPosition.z); // Lower the capsule collider. if (capsuleCollider) { capsuleCollider.height = defaultCapsuleColliderHeight - (defaultHeadYLocalPosition - crouchYLocalPosition); capsuleCollider.center = Vector3.up * capsuleCollider.height * .5f; } // Set state. if (!IsCrouched) { IsCrouched = true; SetSpeedOverrideActive(true); CrouchStart?.Invoke(); } } else if (IsCrouched) { // Reset the head to its default y local position. head.localPosition = new Vector3(head.localPosition.x, defaultHeadYLocalPosition, head.localPosition.z); // Reset the capsule collider's position. if (capsuleCollider) { capsuleCollider.height = defaultCapsuleColliderHeight; capsuleCollider.center = Vector3.up * capsuleCollider.height * .5f; } // Reset state. IsCrouched = false; SetSpeedOverrideActive(false); CrouchEnd?.Invoke(); } }
void LateUpdate() { if (Input.GetKey(key)) { // Enforce a low head. if (headToLower) { // If we don't have the defaultHeadYLocalPosition, get it now. if (!defaultHeadYLocalPosition.HasValue) { defaultHeadYLocalPosition = headToLower.localPosition.y; } // Lower the head. headToLower.localPosition = new Vector3(headToLower.localPosition.x, crouchYHeadPosition, headToLower.localPosition.z); } // Enforce a low colliderToLower. if (colliderToLower) { // If we don't have the defaultColliderHeight, get it now. if (!defaultColliderHeight.HasValue) { defaultColliderHeight = colliderToLower.height; } // Get lowering amount. float loweringAmount; if (defaultHeadYLocalPosition.HasValue) { loweringAmount = defaultHeadYLocalPosition.Value - crouchYHeadPosition; } else { loweringAmount = defaultColliderHeight.Value * .5f; } // Lower the colliderToLower. colliderToLower.height = Mathf.Max(defaultColliderHeight.Value - loweringAmount, 0); colliderToLower.center = Vector3.up * colliderToLower.height * .5f; } // Set IsCrouched state. if (!IsCrouched) { IsCrouched = true; SetSpeedOverrideActive(true); CrouchStart?.Invoke(); } } else { if (IsCrouched) { // Rise the head back up. if (headToLower) { headToLower.localPosition = new Vector3(headToLower.localPosition.x, defaultHeadYLocalPosition.Value, headToLower.localPosition.z); } // Reset the colliderToLower's height. if (colliderToLower) { colliderToLower.height = defaultColliderHeight.Value; colliderToLower.center = Vector3.up * colliderToLower.height * .5f; } // Reset IsCrouched. IsCrouched = false; SetSpeedOverrideActive(false); CrouchEnd?.Invoke(); } } }