コード例 #1
0
    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());
        }
    }
コード例 #2
0
    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);
    }