示例#1
0
    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);
        }
    }
示例#2
0
    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);
            }
        }
    }