using UnityEngine; using System.Collections; public class Suspension : MonoBehaviour { public GameObject dispWheel; public float supLength; public float supStrength; public float supDampner; public Rigidbody carRigid; public RaycastHit supHit; public float supcompressionRatio; //public GameObject carBody; // Use this for initialization void Start () { carRigid = transform.parent.GetComponent(); if (carRigid == null) carRigid = transform.root.GetComponentInChildren(); } // Update is called once per frame void FixedUpdate () { float compRatio = calcCompRatio (); if (compRatio !=0) calcForce (compRatio); } void Update(){ wheelDisplay (supcompressionRatio); } private float calcCompRatio(){ float compressionRatio = 0; RaycastHit hit; Ray ray = new Ray (transform.position, -transform.up); Debug.DrawRay (ray.origin, ray.direction*supLength, Color.green); if (Physics.Raycast (ray, out hit, supLength)) { Debug.DrawRay (ray.origin, ray.direction*hit.distance, Color.red); compressionRatio = 1-hit.distance/supLength; } supHit = hit; supcompressionRatio = compressionRatio; return compressionRatio; } private void calcForce(float compRatio){ Vector3 curVel = carRigid.GetPointVelocity (transform.position); Vector3 curForce = Vector3.Project (curVel, transform.up); Vector3 newForce = Vector3.up * supStrength * compRatio; Vector3 deltaForce = newForce - curForce*supDampner ; //Debug.Log (deltaForce); carRigid.AddForceAtPosition (deltaForce, transform.position); } private void wheelDisplay(float compRatio){ if (dispWheel == null) return; Vector3 newPos = transform.position; newPos.y = transform.position.y - ((1 - compRatio) * supLength)+ (0.25f * dispWheel.transform.lossyScale.y); dispWheel.transform.position = newPos; } }