public class AICarControl : MonoBehaviour {
public WheelCollider FrontLeftWheel;
public WheelCollider FrontRightWheel;
public WheelCollider BackLeftWheel;
public WheelCollider BackRightWheel;
public float[] GearRatio;
public int CurrentGear=0;
public float EngineTorgue=600.0f;
public float MaxEngineRPM=3000.0f;
public float MinEngineRPM=1000.0f;
private float EngineRPM=0.0f;
public GameObject waypointContainer;
private ArrayList waypoints;
private int currentWaypoint=0;
private float inputSteer=0.0f;
private float inputTorque=0.0f;
// Use this for initialization
void Start () {
Vector3 centerOfMass=rigidbody.centerOfMass;
centerOfMass.y=-1.5f;
rigidbody.centerOfMass=centerOfMass;
GetWaypoints();
}
// Update is called once per frame
void Update () {
rigidbody.drag=rigidbody.velocity.magnitude/250;
NavigateTowardsWaypoint();
EngineRPM=(FrontLeftWheel.rpm+FrontRightWheel.rpm)/2*GearRatio[CurrentGear];
ShiftGears();
audio.pitch=Mathf.Abs(EngineRPM/MaxEngineRPM)+1.0f;
if(audio.pitch>2.0)
{
audio.pitch=2.0f;
}
BackLeftWheel.motorTorque=EngineTorgue/GearRatio[CurrentGear]*inputTorque;
BackRightWheel.motorTorque=EngineTorgue/GearRatio[CurrentGear]*inputTorque;
FrontLeftWheel.steerAngle=10*inputSteer;
FrontRightWheel.steerAngle=10*inputSteer;
}
void ShiftGears()
{
int AppropriateGear=CurrentGear;
if(EngineRPM>=MaxEngineRPM)
{
AppropriateGear=CurrentGear;
for(int i=0;i<GearRatio.Length;i++)
{
if(FrontLeftWheel.rpm*GearRatio[i]<MaxEngineRPM)
{
AppropriateGear=i;
break;
}
}
CurrentGear=AppropriateGear;
}
if(EngineRPM<=MaxEngineRPM)
{
AppropriateGear=CurrentGear;
for(int j=GearRatio.Length-1;j>=0;j--)
{
if(FrontLeftWheel.rpm*GearRatio[j]>MinEngineRPM)
{
AppropriateGear=j;
break;
}
}
CurrentGear=AppropriateGear;
}
}
void GetWaypoints()
{
Transform[] potentialWaypoints =waypointContainer.GetComponentsInChildren<Transform>();
waypoints= new ArrayList();
foreach(Transform potentialWaypoint in potentialWaypoints)
{
if(potentialWaypoint!=waypointContainer.transform)
{
waypoints.Add(potentialWaypoint);
}
}
}
void NavigateTowardsWaypoint()
{
Transform waypos=(Transform)waypoints[currentWaypoint];
Vector3 RelativeWaypointPosition=transform.InverseTransformPoint(waypos.position.x,
transform.position.y,
waypos.position.z);
inputSteer=RelativeWaypointPosition.x/RelativeWaypointPosition.magnitude;
if(Mathf.Abs(inputSteer)<0.5)
{
inputTorque=RelativeWaypointPosition.z/RelativeWaypointPosition.magnitude-Mathf.Abs(inputSteer);
}
else
{
inputTorque=0.0f;
}
if(RelativeWaypointPosition.magnitude<20)
{
currentWaypoint++;
if(currentWaypoint>=waypoints.Count)
{
currentWaypoint=0;
}
}
}
}