private SuspensionResults GetCompressionRatio(ref Vector3 point) { RaycastHit hit; SuspensionResults r; if (Physics.Raycast(point, -transform.up, out hit, suspensionLength, groundLayer)) { r.surfaceImpactNormal = hit.normal; r.surfaceImpactPoint = hit.point; r.compressionRatio = 1f - hit.distance / suspensionLength; if (r.compressionRatio > .22 && r.compressionRatio < .28) { Debug.DrawRay(point, -transform.up, Color.green, 0); } else { Debug.DrawRay(point, -transform.up, Color.red, 0); } return(r); } else { Debug.DrawRay(point, -transform.up, Color.red, 0); return(SuspensionResults.zero()); } }
private Vector3 ResolveSuspension() { Vector3 normal = Vector3.zero; for (int i = 0; i < _suspensionPoints.Length; i++) { //first get compression ratio between suspension and ground SuspensionResults results = GetCompressionRatio(ref _suspensionPoints[i].point); //apply upwards force to rigid body scaled by compression ratio at this point if (results.compressionRatio > 0) { normal = results.surfaceImpactNormal; suspensionForce = _rb.velocity.y + (_rb.mass * Physics.gravity.y); _rb.AddForceAtPosition(results.surfaceImpactNormal * results.compressionRatio * -suspensionForce, _suspensionPoints[i].point, ForceMode.Force); } if (debuggerTools) { _suspensionPoints[i].debugger.UpdateData(results.compressionRatio); } } return(normal); }