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); }
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); } }
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; }
/// <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; }
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]; }