Пример #1
0
    void ApplyMotorTorque(RCC_WheelCollider wc, float torque)
    {
        if (TCS)
        {
            WheelHit hit;
            wc.wheelCollider.GetGroundHit(out hit);

            if (Mathf.Abs(wc.rpm) >= 100)
            {
                if (hit.forwardSlip > .25f)
                {
                    TCSAct  = true;
                    torque -= Mathf.Clamp(torque * (hit.forwardSlip) * TCSStrength, 0f, engineTorque);
                }
                else
                {
                    TCSAct  = false;
                    torque += Mathf.Clamp(torque * (hit.forwardSlip) * TCSStrength, -engineTorque, 0f);
                }
            }
            else
            {
                TCSAct = false;
            }
        }

        if (OverTorque())
        {
            torque = 0;
        }

        wc.wheelCollider.motorTorque = ((torque * (1 - clutchInput) * _boostInput) * _gasInput) * (engineTorqueCurve[currentGear].Evaluate(wc.wheelRPMToSpeed * direction) * direction);

        ApplyEngineSound(wc.wheelCollider.motorTorque);
    }
Пример #2
0
 void ApplySteering(RCC_WheelCollider wc)
 {
     if (applyCounterSteering)
     {
         wc.wheelCollider.steerAngle = Mathf.Clamp((steerAngle * (steerInput + driftAngle)), -steerAngle, steerAngle);
     }
     else
     {
         wc.wheelCollider.steerAngle = Mathf.Clamp((steerAngle * steerInput), -steerAngle, steerAngle);
     }
 }
Пример #3
0
    void ApplyBrakeTorque(RCC_WheelCollider wc, float brake)
    {
        if (ABS && handbrakeInput <= .1f)
        {
            WheelHit hit;
            wc.wheelCollider.GetGroundHit(out hit);

            if ((Mathf.Abs(hit.forwardSlip) * Mathf.Clamp01(brake)) >= ABSThreshold)
            {
                ABSAct = true;
                brake  = 0;
            }
            else
            {
                ABSAct = false;
            }
        }
        wc.wheelCollider.brakeTorque = brake;
    }
Пример #4
0
    /// <summary>
    /// Creates the wheel colliders.
    /// </summary>
    public void CreateWheelColliders(RCC_CarControllerV3 carController)
    {
        // Creating a list for all wheel models.
        List <Transform> allWheelModels = new List <Transform>();

        allWheelModels.Add(carController.FrontLeftWheelTransform); allWheelModels.Add(carController.FrontRightWheelTransform); allWheelModels.Add(carController.RearLeftWheelTransform); allWheelModels.Add(carController.RearRightWheelTransform);

        // If we have additional rear wheels, add them too.
        if (carController.ExtraRearWheelsTransform.Length > 0 && carController.ExtraRearWheelsTransform[0])
        {
            foreach (Transform t in carController.ExtraRearWheelsTransform)
            {
                allWheelModels.Add(t);
            }
        }

        // If we don't have any wheelmodels, throw an error.
        if (allWheelModels != null && allWheelModels[0] == null)
        {
            Debug.LogError("You haven't choosen your Wheel Models. Please select all of your Wheel Models before creating Wheel Colliders. Script needs to know their sizes and positions, aye?");
            return;
        }

        // Holding default rotation.
        Quaternion currentRotation = transform.rotation;

        // Resetting rotation.
        transform.rotation = Quaternion.identity;

        // Creating a new gameobject called Wheel Colliders for all Wheel Colliders, and parenting it to this gameobject.
        GameObject WheelColliders = new GameObject("Wheel Colliders");

        WheelColliders.transform.SetParent(transform, false);
        WheelColliders.transform.localRotation = Quaternion.identity;
        WheelColliders.transform.localPosition = Vector3.zero;
        WheelColliders.transform.localScale    = Vector3.one;

        // Creating WheelColliders.
        foreach (Transform wheel in allWheelModels)
        {
            GameObject wheelcollider = new GameObject(wheel.transform.name);

            wheelcollider.transform.position = RCC_GetBounds.GetBoundsCenter(wheel.transform);
            wheelcollider.transform.rotation = transform.rotation;
            wheelcollider.transform.name     = wheel.transform.name;
            wheelcollider.transform.SetParent(WheelColliders.transform);
            wheelcollider.transform.localScale = Vector3.one;
            wheelcollider.AddComponent <WheelCollider>();

            Bounds     biggestBound = new Bounds();
            Renderer[] renderers    = wheel.GetComponentsInChildren <Renderer>();

            foreach (Renderer render in renderers)
            {
                if (render != GetComponent <Renderer>())
                {
                    if (render.bounds.size.z > biggestBound.size.z)
                    {
                        biggestBound = render.bounds;
                    }
                }
            }

            wheelcollider.GetComponent <WheelCollider>().radius = (biggestBound.extents.y) / transform.localScale.y;
            wheelcollider.AddComponent <RCC_WheelCollider>();
            JointSpring spring = wheelcollider.GetComponent <WheelCollider>().suspensionSpring;

            spring.spring         = 40000f;
            spring.damper         = 1500f;
            spring.targetPosition = .5f;

            wheelcollider.GetComponent <WheelCollider>().suspensionSpring      = spring;
            wheelcollider.GetComponent <WheelCollider>().suspensionDistance    = .2f;
            wheelcollider.GetComponent <WheelCollider>().forceAppPointDistance = 0f;
            wheelcollider.GetComponent <WheelCollider>().mass             = 40f;
            wheelcollider.GetComponent <WheelCollider>().wheelDampingRate = 1f;

            WheelFrictionCurve sidewaysFriction;
            WheelFrictionCurve forwardFriction;

            sidewaysFriction = wheelcollider.GetComponent <WheelCollider>().sidewaysFriction;
            forwardFriction  = wheelcollider.GetComponent <WheelCollider>().forwardFriction;

            forwardFriction.extremumSlip   = .3f;
            forwardFriction.extremumValue  = 1;
            forwardFriction.asymptoteSlip  = .8f;
            forwardFriction.asymptoteValue = .6f;
            forwardFriction.stiffness      = 1.5f;

            sidewaysFriction.extremumSlip   = .3f;
            sidewaysFriction.extremumValue  = 1;
            sidewaysFriction.asymptoteSlip  = .5f;
            sidewaysFriction.asymptoteValue = .8f;
            sidewaysFriction.stiffness      = 1.5f;

            wheelcollider.GetComponent <WheelCollider>().sidewaysFriction = sidewaysFriction;
            wheelcollider.GetComponent <WheelCollider>().forwardFriction  = forwardFriction;
        }

        RCC_WheelCollider[] allWheelColliders = new RCC_WheelCollider[allWheelModels.Count];
        allWheelColliders = GetComponentsInChildren <RCC_WheelCollider>();

        carController.FrontLeftWheelCollider  = allWheelColliders[0];
        carController.FrontRightWheelCollider = allWheelColliders[1];
        carController.RearLeftWheelCollider   = allWheelColliders[2];
        carController.RearRightWheelCollider  = allWheelColliders[3];

        carController.ExtraRearWheelsCollider = new RCC_WheelCollider[carController.ExtraRearWheelsTransform.Length];

        for (int i = 0; i < carController.ExtraRearWheelsTransform.Length; i++)
        {
            carController.ExtraRearWheelsCollider[i] = allWheelColliders[i + 4];
        }

        transform.rotation = currentRotation;
    }
Пример #5
0
    public void CreateWheelColliders()     //функция для редактора
    {
        List <Transform> allWheelModels = new List <Transform>();

        allWheelModels.Add(FrontLeftWheelTransform); allWheelModels.Add(FrontRightWheelTransform); allWheelModels.Add(RearLeftWheelTransform); allWheelModels.Add(RearRightWheelTransform);

        if (allWheelModels != null && allWheelModels[0] == null)
        {
            Debug.LogError("You haven't choose your Wheel Models. Please select all of your Wheel Models before creating Wheel Colliders. Script needs to know their sizes and positions, aye?");
            return;
        }

        transform.rotation = Quaternion.identity;

        GameObject WheelColliders = new GameObject("Wheel Colliders");

        WheelColliders.transform.SetParent(transform, false);
        WheelColliders.transform.localRotation = Quaternion.identity;
        WheelColliders.transform.localPosition = Vector3.zero;
        WheelColliders.transform.localScale    = Vector3.one;

        foreach (Transform wheel in allWheelModels)
        {
            GameObject wheelcollider = new GameObject(wheel.transform.name);

            wheelcollider.transform.position = wheel.transform.position;
            wheelcollider.transform.rotation = transform.rotation;
            wheelcollider.transform.name     = wheel.transform.name;
            wheelcollider.transform.SetParent(WheelColliders.transform);
            wheelcollider.transform.localScale = Vector3.one;
            wheelcollider.AddComponent <WheelCollider>();

            Bounds     biggestBound = new Bounds();
            Renderer[] renderers    = wheel.GetComponentsInChildren <Renderer>();

            foreach (Renderer render in renderers)
            {
                if (render != GetComponent <Renderer>())
                {
                    if (render.bounds.size.z > biggestBound.size.z)
                    {
                        biggestBound = render.bounds;
                    }
                }
            }

            wheelcollider.GetComponent <WheelCollider>().radius = (biggestBound.extents.y) / transform.localScale.y;
            wheelcollider.AddComponent <RCC_WheelCollider>();
            JointSpring spring = wheelcollider.GetComponent <WheelCollider>().suspensionSpring;

            spring.spring         = 40000f;
            spring.damper         = 2000f;
            spring.targetPosition = .4f;

            wheelcollider.GetComponent <WheelCollider>().suspensionSpring      = spring;
            wheelcollider.GetComponent <WheelCollider>().suspensionDistance    = .2f;
            wheelcollider.GetComponent <WheelCollider>().forceAppPointDistance = .1f;
            wheelcollider.GetComponent <WheelCollider>().mass             = 40f;
            wheelcollider.GetComponent <WheelCollider>().wheelDampingRate = 1f;

            WheelFrictionCurve sidewaysFriction;
            WheelFrictionCurve forwardFriction;

            sidewaysFriction = wheelcollider.GetComponent <WheelCollider>().sidewaysFriction;
            forwardFriction  = wheelcollider.GetComponent <WheelCollider>().forwardFriction;

            wheelcollider.transform.localPosition = new Vector3(wheelcollider.transform.localPosition.x, wheelcollider.transform.localPosition.y + wheelcollider.GetComponent <WheelCollider>().suspensionDistance, wheelcollider.transform.localPosition.z);

            forwardFriction.extremumSlip   = .2f;
            forwardFriction.extremumValue  = 1;
            forwardFriction.asymptoteSlip  = .8f;
            forwardFriction.asymptoteValue = .75f;
            forwardFriction.stiffness      = 1.5f;

            sidewaysFriction.extremumSlip   = .25f;
            sidewaysFriction.extremumValue  = 1;
            sidewaysFriction.asymptoteSlip  = .5f;
            sidewaysFriction.asymptoteValue = .75f;
            sidewaysFriction.stiffness      = 1.5f;

            wheelcollider.GetComponent <WheelCollider>().sidewaysFriction = sidewaysFriction;
            wheelcollider.GetComponent <WheelCollider>().forwardFriction  = forwardFriction;
        }

        RCC_WheelCollider[] allWheelColliders = new RCC_WheelCollider[allWheelModels.Count];
        allWheelColliders = GetComponentsInChildren <RCC_WheelCollider>();

        AudioSource audioSource = RCC_CreateAudioSource.NewAudioSource(gameObject, "Skid Sound AudioSource", 5, 50, 0, null, true, true, false);

        for (int l = 0; l < allWheelColliders.Length; l++)
        {
            for (int i = 0; i < RCC_GroundMaterials.Instance.frictions.Length; i++)
            {
                ParticleSystem.EmissionModule emission;
                GameObject ps = (GameObject)Instantiate(RCC_GroundMaterials.Instance.frictions[i].groundParticles,
                                                        transform.position, transform.rotation, allWheelColliders[l].transform) as GameObject;
                emission                   = ps.GetComponent <ParticleSystem>().emission;
                emission.enabled           = false;
                ps.transform.localPosition = Vector3.zero;
                ps.transform.localRotation = Quaternion.identity;
                allWheelColliders[l].allWheelParticles.Add(ps.GetComponent <ParticleSystem>());
            }
            allWheelColliders[l].audioSource = audioSource;

            allWheelColliders[l].carController = this;
            allWheelColliders[l].carRigid      = GetComponent <Rigidbody>();
            allWheelColliders[l].wheelCollider = GetComponent <WheelCollider>();
            allWheelColliders[l].allWheelColliders.Add(allWheelColliders[0]);
            allWheelColliders[l].allWheelColliders.Add(allWheelColliders[1]);
            allWheelColliders[l].allWheelColliders.Add(allWheelColliders[2]);
            allWheelColliders[l].allWheelColliders.Add(allWheelColliders[3]);
            allWheelColliders[l].allWheelColliders.Remove(allWheelColliders[l]);
        }

        FrontLeftWheelCollider  = allWheelColliders[0];
        FrontRightWheelCollider = allWheelColliders[1];
        RearLeftWheelCollider   = allWheelColliders[2];
        RearRightWheelCollider  = allWheelColliders[3];
    }