using UnityEngine;
public class PlayerCarController : MonoBehaviour
{
public Rigidbody player;
public Transform frontAxle;
public Transform rearAxle;
public float speed;
public AnimationCurve accelerationCurve;
public float maxCarSpeed;
public float currentSpeed;
public float normalizedSpeed;
public float turnSpeed;
public AnimationCurve rearGripFactorCurve;
public AnimationCurve frontGripFactorCurve;
private Vector3 centerOfMass;
private Vector3 currentSlip;
private void Awake()
{
player = GetComponent<Rigidbody>();
}
public void FixedUpdate()
{
Drive();
Grip();
Turn();
}
public void Drive()
{
float rollingDirection = InputReader.accelerationFactor - InputReader.brakeFactor;
float forwardForce = speed * GetAccelertion();
player.AddForce(transform.forward * (forwardForce * rollingDirection * Time.deltaTime));
}
public float GetAccelertion()
{
currentSpeed = player.linearVelocity.magnitude;
normalizedSpeed = currentSpeed / maxCarSpeed;
return accelerationCurve.Evaluate(normalizedSpeed);
}
public void Grip()
{
Vector3 slipVector = transform.right * Vector3.Dot(transform.right, player.linearVelocity.normalized);
float rearGripFactor = rearGripFactorCurve.Evaluate(normalizedSpeed);
float frontGripFactor = frontGripFactorCurve.Evaluate(normalizedSpeed);
player.AddForceAtPosition((slipVector * (Time.deltaTime * speed * rearGripFactor * -1)) / 2, rearAxle.position);
player.AddForceAtPosition((slipVector * (Time.deltaTime * speed * frontGripFactor * -1)) / 2, frontAxle.position);
}
public void Turn()
{
transform.RotateAround(transform.position, transform.up, Time.deltaTime * InputReader.steerDirection * turnSpeed);
}
}
评论 (0)