var FrontLeftWheel : WheelCollider; var FrontRightWheel : WheelCollider; var GearRatio : float[]; var CurrentGear : int = 0; var EngineTorque : float = 600.0f; var MaxEngineRPM : float = 3000.0f; var MinEngineRPM : float = 1000.0f; private var EngineRPM : float = 0.0f; var waypointContainer : GameObject; private var waypoints : Array; public var currentWaypoint : int = 0; private var inputSteer : float = 0.0; private var inputTorque : float = 0.0; function Start () { rigidbody.centerOfMass.y=-1.5; GetWaypoints(); } function Update () { rigidbody.drag = rigidbody.velocity.magnitude / 250; NavigateTowardsWaypoint(); EngineRPM = (FrontLeftWheel.rpm + FrontRightWheel.rpm)/2 * GearRatio[CurrentGear]; ShiftGears(); FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * inputTorque; FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * inputTorque; FrontLeftWheel.steerAngle = 10 * inputSteer; FrontRightWheel.steerAngle = 10 * inputSteer; } function ShiftGears() { if ( EngineRPM >= MaxEngineRPM ) { var AppropriateGear : int = CurrentGear; for ( var i = 0; i < GearRatio.length; i ++ ) { if ( FrontLeftWheel.rpm * GearRatio[i] < MaxEngineRPM ) { AppropriateGear = i; break; } } CurrentGear = AppropriateGear; } if ( EngineRPM <= MinEngineRPM ) { AppropriateGear = CurrentGear; for ( var j = GearRatio.length-1; j >= 0; j -- ) { if ( FrontLeftWheel.rpm * GearRatio[j] > MinEngineRPM ) { AppropriateGear = j; break; } } CurrentGear = AppropriateGear; } } function GetWaypoints () { var potentialWaypoints : Array = waypointContainer.GetComponentsInChildren(Transform ); waypoints = new Array(); for ( var potentialWaypoint : Transform in potentialWaypoints ) { if ( potentialWaypoint != waypointContainer.transform ) { waypoints[ waypoints.length ] = potentialWaypoint; } } } function NavigateTowardsWaypoint () { var RelativeWaypointPosition : Vector3 = this.transform.InverseTransformPoint( Vector3( waypoints[currentWaypoint].position.x, transform.position.y, waypoints[currentWaypoint].position.z ) ); inputSteer = RelativeWaypointPosition.x / RelativeWaypointPosition.magnitude; print(inputSteer); if ( Mathf.Abs( inputSteer ) < 0.5 ) { inputTorque = RelativeWaypointPosition.y / RelativeWaypointPosition.magnitude - Mathf.Abs( inputSteer ); }else{ inputTorque = 0.0; } if ( RelativeWaypointPosition.magnitude < 20 ) { currentWaypoint ++; if ( currentWaypoint >= waypoints.length ) { currentWaypoint = 0; } } }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)