/// <summary> /// Updates on a fixed time interval. /// </summary> void FixedUpdate() { //Check for lap reset button if (vcr.GetButtonDown("Reset")) { ResetLap(); } else if (Input.GetButtonDown("Reset")) { ResetLap(); } /* * //Check for pause button, doesn't actually work yet * if( vcr.GetButtonDown( "Reset" ) ) * { * Time.timeScale = 0; * isPaused = true; * } * else if( vcr.GetButtonDown( "Reset" ) && isPaused ) * { * Time.timeScale = 1; * isPaused = false; * }*/ //Boost //if( useVCR ) // isBoosting = vcr.GetAxis( "Boost" ) > 0.0f; //else // isBoosting = Input.GetAxis( "Boost" ) > 0.0f; // Rotate to match plane // 0: Front // 1: Back // 2: Left // 3: Right // Do raycasts for (int ii = 0; ii < raycasters.Length; ++ii) { Physics.Raycast(raycasters[ii].transform.position, -raycasters[ii].transform.up, out raycastHits[ii]); } //print out the raycast distances //Debug.Log( raycastHits[ 0 ].distance + ", " + raycastHits[ 1 ].distance + " / " + raycastHits[ 2 ].distance + ", " + raycastHits[ 3 ].distance ); //push directly downwards when rotating onto a berm //if( transform.eulerAngles.z < 180.0f && transform.eulerAngles.z > 5.0f ) // rigidbody.AddForce( new Vector3( 0f, -100.0f * transform.eulerAngles.z, 0.0f ) ); //else if( transform.eulerAngles.z > 180.0f && transform.eulerAngles.z < 355.0f ) // rigidbody.AddForce( new Vector3( 0f, -100.0f * ( 360.0f - transform.eulerAngles.z ), 0.0f ) ); //push forwards when going up a hill //if( transform.eulerAngles.x > 180.0f ) //rigidbody.AddForce( new Vector3( 0.0f, 0.0f, 100.0f * ( 360f - transform.eulerAngles.x ) ) ); // If on the track if (raycastHits[0].distance < 1.5f || raycastHits[1].distance < 1.5f) { //hover off the ground rigidbody.AddRelativeForce(0.0f, 150.0f, 0.0f); // If the front and back of the ship are not balanced, rotate to balance them if (raycastHits[0].distance != raycastHits[1].distance) { transform.Rotate( Mathf.Atan((raycastHits[0].distance - raycastHits[1].distance) / (raycasters[1].transform.localPosition.z - raycasters[0].transform.localPosition.z)), 0.0f, 0.0f); } // Rotate up onto berms if (Mathf.Abs(raycastHits[2].distance - raycastHits[3].distance) > 0.05f) { transform.Rotate( 0.0f, 0.0f, Mathf.Atan((raycastHits[2].distance - raycastHits[3].distance) / (raycasters[2].transform.localPosition.z - raycasters[3].transform.localPosition.z))); } } //if going over a jump or off the track, turn the noise downwards else if (raycastHits[0].distance > 2f && raycastHits[1].distance > 2f) { transform.Rotate(rigidbody.mass / 5.0f, 0.0f, 0.0f); //magnetize down onto to the track if you get too far off rigidbody.AddRelativeForce(0.0f, Mathf.Min(-150.0f * raycastHits[0].distance, 5000f), 0.0f); Physics.gravity = new Vector3(0, Mathf.Min(-150.0f * raycastHits[0].distance, 5000f), 0); } // Lean if (useVCR) { if (vcr.GetAxis("Horizontal") < 0.0f) { currentTurn = Mathf.Max(new float[] { vcr.GetAxis("Horizontal"), currentTurn - (turnAcceleration * Time.deltaTime) }); } else if (vcr.GetAxis("Horizontal") > 0.0f) { currentTurn = Mathf.Min(new float[] { vcr.GetAxis("Horizontal"), currentTurn + (turnAcceleration * Time.deltaTime) }); } else if (Mathf.Abs(currentTurn) > 0.2f) { currentTurn = currentTurn + ((currentTurn > 0.0f ? -turnAcceleration : turnAcceleration) * Time.deltaTime); } else { currentTurn = 0.0f; } } else { if (Input.GetAxis("Horizontal") < 0.0f) { currentTurn = Mathf.Max(new float[] { Input.GetAxis("Horizontal"), currentTurn - (turnAcceleration * Time.deltaTime) }); } else if (Input.GetAxis("Horizontal") > 0.0f) { currentTurn = Mathf.Min(new float[] { Input.GetAxis("Horizontal"), currentTurn + (turnAcceleration * Time.deltaTime) }); } else if (Mathf.Abs(currentTurn) > 0.2f) { currentTurn = currentTurn + ((currentTurn > 0.0f ? -turnAcceleration : turnAcceleration) * Time.deltaTime); } else { currentTurn = 0.0f; } } model.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, maxRotation * currentTurn); float forwardVelocity = transform.InverseTransformDirection(rigidbody.velocity).z; // Rotate rigidbody.AddTorque(rigidbody.transform.up * -currentTurn * rotateSpeed); rigidbody.velocity = rigidbody.transform.forward * forwardVelocity; if (rigidbody.angularVelocity.magnitude > maxAngularVelocity) { rigidbody.angularVelocity = rigidbody.angularVelocity.normalized * maxAngularVelocity; } // Accelerate if (useVCR) { rigidbody.AddForce(rigidbody.transform.forward * (vcr.GetAxis("Vertical") * acceleration * Time.deltaTime * (isBoosting ? boostAccelerationMultiplier : 1.0f))); } else { rigidbody.AddForce(rigidbody.transform.forward * (Input.GetAxis("Vertical") * acceleration * Time.deltaTime * (isBoosting ? boostAccelerationMultiplier : 1.0f))); } if (!isBoosting && forwardVelocity > maxSpeed + 10.0f) { rigidbody.velocity = rigidbody.velocity.normalized * (forwardVelocity - 10.0f); } else if (!isBoosting && forwardVelocity > maxSpeed) { rigidbody.velocity = rigidbody.velocity.normalized * maxSpeed; speedLines.Play(); } else if (isBoosting && forwardVelocity > boostMaxSpeed) { rigidbody.velocity = rigidbody.velocity.normalized * boostMaxSpeed; speedLines.Play(); } else { speedLines.Stop(); } // Change particles based on input if (useVCR) { engineParticles.emissionRate = (vcr.GetAxis("Vertical") + (isBoosting ? 1.0f : 0.0f)) * 400.0f; } else { engineParticles.emissionRate = (Input.GetAxis("Vertical") + (isBoosting ? 1.0f : 0.0f)) * 400.0f; } }