43 lines
1.8 KiB
C#
43 lines
1.8 KiB
C#
using UnityEngine;
|
||
|
||
[ExecuteInEditMode()]
|
||
public class EasySuspension : MonoBehaviour
|
||
{
|
||
[Range(0, 20)] public float naturalFrequency = 10;
|
||
[Range(0, 3)] public float dampingRatio = 0.8f;
|
||
[Range(-1, 1)] public float forceShift = 0.03f;
|
||
public bool setSuspensionDistance = true;
|
||
|
||
private float playModeTimer = 0f;
|
||
|
||
void Update()
|
||
{
|
||
// В режиме игры настраиваем подвеску только первые 0.25 сек при спавне авто.
|
||
// Постоянный пересчет в каждом кадре вызывает вибрацию машины при спущенных шинах и на домкрате!
|
||
if (Application.isPlaying)
|
||
{
|
||
if (playModeTimer > 0.25f) return;
|
||
playModeTimer += Time.deltaTime;
|
||
}
|
||
|
||
Rigidbody rb = GetComponent<Rigidbody>();
|
||
if (rb == null) return;
|
||
|
||
foreach (WheelCollider wc in GetComponentsInChildren<WheelCollider>())
|
||
{
|
||
if (!wc.enabled || wc.sprungMass <= 0.001f) continue;
|
||
|
||
JointSpring spring = wc.suspensionSpring;
|
||
spring.spring = Mathf.Pow(Mathf.Sqrt(wc.sprungMass) * naturalFrequency, 2);
|
||
spring.damper = 2 * dampingRatio * Mathf.Sqrt(spring.spring * wc.sprungMass);
|
||
wc.suspensionSpring = spring;
|
||
|
||
Vector3 wheelRelativeBody = transform.InverseTransformPoint(wc.transform.position);
|
||
float distance = rb.centerOfMass.y - wheelRelativeBody.y + wc.radius;
|
||
wc.forceAppPointDistance = distance - forceShift;
|
||
|
||
if (spring.targetPosition > 0 && spring.spring > 0.001f && setSuspensionDistance)
|
||
wc.suspensionDistance = wc.sprungMass * Physics.gravity.magnitude / (spring.targetPosition * spring.spring);
|
||
}
|
||
}
|
||
} |