- Home /
2 Scripting Errors I need help fixing!!
I keep getting these 2 errors on a car game im trying to work on.The example project works perfect and i have mine setup exactly as the example except i have 6 wheels and not 4. Ok errors are "*IndexOutOfRangeException: Array index is out of range. PlayerCar_Script.Update () (at Assets/Scripts/Car Control/PlayerCar_Script.js:44)"
Code:
// ----------- CAR TUTORIAL SAMPLE PROJECT, ? Andrew Gotow 2009 -----------------
// Here's the basic car script described in my tutorial at www.gotow.net/andrew/blog. // A Complete explaination of how this script works can be found at the link above, along // with detailed instructions on how to write one of your own, and tips on what values to // assign to the script variables for it to work well for your application.
// Contact me at Maxwelldoggums@Gmail.com for more information.
// These variables allow the script to power the wheels of the car. var FrontLeftWheel : WheelCollider; var FrontRightWheel : WheelCollider;
// These variables are for the gears, the array is the list of ratios. The script // uses the defined gear ratios to determine how much torque to apply to the wheels. var GearRatio : float[]; var CurrentGear : int = 0;
// These variables are just for applying torque to the wheels and shifting gears. // using the defined Max and Min Engine RPM, the script can determine what gear the // car needs to be in. var EngineTorque : float = 600.0; var MaxEngineRPM : float = 3000.0; var MinEngineRPM : float = 1000.0; private var EngineRPM : float = 0.0;
function Start () { // I usually alter the center of mass to make the car more stable. I'ts less likely to flip this way. rigidbody.centerOfMass.y = -1.5; }
function Update () {
// This is to limith the maximum speed of the car, adjusting the drag probably isn't the best way of doing it,
// but it's easy, and it doesn't interfere with the physics processing.
rigidbody.drag = rigidbody.velocity.magnitude / 250;
// Compute the engine RPM based on the average RPM of the two wheels, then call the shift gear function
EngineRPM = (FrontLeftWheel.rpm + FrontRightWheel.rpm)/2 * GearRatio[CurrentGear];
ShiftGears();
// set the audio pitch to the percentage of RPM to the maximum RPM plus one, this makes the sound play
// up to twice it's pitch, where it will suddenly drop when it switches gears.
audio.pitch = Mathf.Abs(EngineRPM / MaxEngineRPM) + 1.0 ;
// this line is just to ensure that the pitch does not reach a value higher than is desired.
if ( audio.pitch > 2.0 ) {
audio.pitch = 2.0;
}
// finally, apply the values to the wheels. The torque applied is divided by the current gear, and
// multiplied by the user input variable.
FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
// the steer angle is an arbitrary value multiplied by the user input.
FrontLeftWheel.steerAngle = 10 * Input.GetAxis("Horizontal");
FrontRightWheel.steerAngle = 10 * Input.GetAxis("Horizontal");
}
function ShiftGears() { // this funciton shifts the gears of the vehcile, it loops through all the gears, checking which will make // the engine RPM fall within the desired range. The gear is then set to this "appropriate" value. 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;
}
}
"transform.position assign attempt for 'Object02' is not valid. Input position is { NaN, NaN, NaN }. UnityEngine.Transform:set_position(Vector3) WheelAlignment_Script:Update() (at Assets/Scripts/Car Control/WheelAlignment_Script.js:21)"
Code:
// Define the variables used in the script, the Corresponding collider is the wheel collider at the position of // the visible wheel, the slip prefab is the prefab instantiated when the wheels slide, the rotation value is the // value used to rotate the wheel around it's axel. var CorrespondingCollider : WheelCollider; var SlipPrefab : GameObject; private var RotationValue : float = 0.0;
function Update () {
// define a hit point for the raycast collision
var hit : RaycastHit;
// Find the collider's center point, you need to do this because the center of the collider might not actually be
// the real position if the transform's off.
var ColliderCenterPoint : Vector3 = CorrespondingCollider.transform.TransformPoint( CorrespondingCollider.center );
// now cast a ray out from the wheel collider's center the distance of the suspension, if it hit something, then use the "hit"
// variable's data to find where the wheel hit, if it didn't, then se tthe wheel to be fully extended along the suspension.
if ( Physics.Raycast( ColliderCenterPoint, -CorrespondingCollider.transform.up, hit, CorrespondingCollider.suspensionDistance + CorrespondingCollider.radius ) ) {
transform.position = hit.point + (CorrespondingCollider.transform.up * CorrespondingCollider.radius);
}else{
transform.position = ColliderCenterPoint - (CorrespondingCollider.transform.up * CorrespondingCollider.suspensionDistance);
}
// now set the wheel rotation to the rotation of the collider combined with a new rotation value. This new value
// is the rotation around the axle, and the rotation from steering input.
transform.rotation = CorrespondingCollider.transform.rotation * Quaternion.Euler( RotationValue, CorrespondingCollider.steerAngle, 0 );
// increase the rotation value by the rotation speed (in degrees per second)
RotationValue += CorrespondingCollider.rpm * ( 360/60 ) * Time.deltaTime;
// define a wheelhit object, this stores all of the data from the wheel collider and will allow us to determine
// the slip of the tire.
var CorrespondingGroundHit : WheelHit;
CorrespondingCollider.GetGroundHit( CorrespondingGroundHit );
// if the slip of the tire is greater than 2.0, and the slip prefab exists, create an instance of it on the ground at
// a zero rotation.
if ( Mathf.Abs( CorrespondingGroundHit.sidewaysSlip ) > 2.0 ) {
if ( SlipPrefab ) {
Instantiate( SlipPrefab, CorrespondingGroundHit.point, Quaternion.identity );
}
}
}
Could you point us to the line that's actually generating the error so that we don't have to dig through all that code?
For next time - use the code button on selected code, don't press it then put code between the two symbols
Answer by Lawrie · Oct 31, 2010 at 01:05 PM
I'm getting the EXACT same issues. I spent most of yesterday creating and recreating this scene. For reference, the source is form this tutorial:
http://www.gotow.net/andrew/blog/?page_id=78
EDIT
I've discovered the issue, after scouring the tutorial text and the comments. In all honesty, I don't think it's made entirely clear, but it is in there.
Both errors stem from the issue with the GearRatio array, and that issue stems from the fact that nothing is automatically added to the GearRatio array (i.e. the array is empty).
Select your PlayerCar object, and with that selected (assuming you've got your PlayerCar_Script attached to it), look in the Inspector panel. You should see, under the WheelCollider assignments, 'Gear Ratio', with an arrow next to it.
Click on that arrow, and you can define the length of that array. Change the array length to 6, and you can then assign values to each array element. If you skip right to the end of that tutorial, you'll see he actually gives the ratios that he's used for his cars. Enter those, and you should be good to go.
Answer by boymeetsrobot · Oct 31, 2010 at 09:49 AM
It is hard to debug out of context, but the first issue looks like it comes from the ShiftGears function. Try changing this:-
for ( var i = 0; i < GearRatio.length; i ++ ) {
if ( FrontLeftWheel.rpm * GearRatio[i] < MaxEngineRPM ) {
AppropriateGear = i;
break;
}
}
To this:-
for ( var i = 0; i < GearRatio.length - 1; i ++ ) {
if ( FrontLeftWheel.rpm * GearRatio[i] < MaxEngineRPM ) {
AppropriateGear = i;
break;
}
}
Good luck.
Answer by Felipe 1 · Feb 19, 2011 at 10:39 PM
Hello!
Thank you by your advice Lawrie, I'm following the very same tutorial and that was exactly my problem. Now my car can move.
But then another problem came: Everytime I press the gas key, the car jumps foward (making a 360 roll over the roof) and crashes. I checked the mass and suspension parameters, but I can't point where the trouble is
Your answer
Follow this Question
Related Questions
SceneCamera NAN persisting problem 2 Answers
HELP! is this a Bug in the game engine? 1 Answer
how to fix Index Out Of Range Exception 1 Answer
suddenly have 'nan, nan, nan' error 2 Answers
Transform.rotate returns NAN error. 0 Answers