void OnDrawGizmos() { if (wheels == null || !showGizmos) { return; } foreach (RoverWheel wheel in wheels) { RoverWheel.Modes wheelMode = wheel.GetMode(); if (wheelMode == RoverWheel.Modes.below_terrain) { Gizmos.color = Color.blue; } else if (wheelMode == RoverWheel.Modes.contact) { Gizmos.color = Color.green; } else if (wheelMode == RoverWheel.Modes.no_contact) { Gizmos.color = Color.red; } else { Gizmos.color = Color.white; } Gizmos.DrawSphere(wheel.transform.position, 0.5f); } }
void FixedUpdate() { int wheelTouchCounter = 0; foreach (RoverWheel wheel in wheels) { RoverWheel.Modes wheelMode = wheel.GetMode(); if (wheelMode == RoverWheel.Modes.contact || wheelMode == RoverWheel.Modes.below_terrain) { wheelTouchCounter++; //apply upward force to vehicle from wheel rb.AddForceAtPosition(transform.up * maxSuspensionForce * wheel.GetForceRatio(), wheel.transform.position); //apply force for sideways skidding Vector3 sidewaysProjection = Vector3.Project(rb.velocity, transform.right); rb.AddForceAtPosition(sidewaysProjection * sidewaysMultiplier * -1, wheel.transform.position); //apply driving forward force if (roverMode == RoverModes.driving) { rb.AddForceAtPosition(transform.forward * currentThrust, wheel.gameObject.transform.position); } } } if (!hasBeenDriven && wheelTouchCounter == wheelGameObjects.Length) { rb.isKinematic = true; } DampenMovementWithSuspension(wheelTouchCounter); //apply turning if (roverMode == RoverModes.driving) { rb.AddRelativeTorque(transform.up * currentTurn * turnStrength); } if (roverMode == RoverModes.braking || roverMode == RoverModes.parked) { ApplyBrakes(wheelTouchCounter); } //turn wheels if (roverMode == RoverModes.driving) { float metersThisFrame = rb.velocity.magnitude * Time.fixedDeltaTime; float angle = (metersThisFrame / wheelCircumference) * 360; foreach (GameObject wheelGO in rotatingWheelGameObjects) { wheelGO.transform.RotateAround(wheelGO.transform.position, wheelGO.transform.right, angle); } } }