Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class CarControler : MonoBehaviour
{
public WheelCollider[] WColForward; // масив с передними колесами
public WheelCollider[] WColBack; // масив с задними колесами
public Transform[] wheelF;
public Transform[] wheelB;
public float wheelOfSet= 0.1f;
public float wheelRadius = 0.13f;
public float maxSteer = 30; // макисмальный угол поворота колес
public float maxAccel = 25; // максимальный крутящий момент
public float maxBrake = 50; // максимальный тормозной момент
public class WheelData
{
public Transform wheelTransform;
public WheelCollider col;
public Vector3 wheelStartPos;
public float rotation = 0.0f;
}
protected WheelData[] wheels;
public Transform COM; // центр тяжести
void Start ()
{
rigidbody.centerOfMass = COM.localPosition; // устанавливаем центр массы
wheels = new WheelData[WColForward.Length+WColBack.Length];
for (int i = 0; i < WColForward.Length; i++)
{
wheels[i] = SetupWheels(wheelF[i], WColForward[i]);
}
for (int i = 0; i < WColBack.Length; i++)
{
wheels[i + WColForward.Length] = SetupWheels(wheelB[i],WColBack[i]);
}
}
private WheelData SetupWheels(Transform wheel, WheelCollider col)
{
WheelData result = new WheelData();
result.wheelTransform = wheel;
result.col = col;
result.wheelStartPos = wheel.transform.localPosition;
return result;
}
void FixedUpdate()
{
float accel = 0; // крутящий момент
float steer = 0; // угол поворота
accel = Input.GetAxis("Vertical"); // контролируем крутящий момент
steer = Input.GetAxis("Horizontal"); // контролируем угол поворота
CarMove(accel, steer); // передаем значение функции CarMove()
UpdateWheels();
}
private void UpdateWheels()
{ //11
float delta = Time.fixedDeltaTime; //12
foreach (WheelData w in wheels)
{ //13
WheelHit hit; //14
Vector3 lp = w.wheelTransform.localPosition; //15
if (w.col.GetGroundHit(out hit))
{ //16
lp.y -= Vector3.Dot(w.wheelTransform.position - hit.point, transform.up) - wheelRadius; //17
}
else
{ //18
lp.y = w.wheelStartPos.y - wheelOfSet; //18
}
w.wheelTransform.localPosition = lp; //19
w.rotation = Mathf.Repeat(w.rotation + delta * w.col.rpm * 360.0f / 60.0f, 360.0f); //20
w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.col.steerAngle, 90.0f); //21
}
}
private void CarMove(float accel, float steer) // принимаем значение кртящего момента и и поворота
{
foreach (WheelCollider col in WColForward) // перебираем все колеса
{
col.steerAngle = steer*maxSteer ; // поворачиваем колесо с полученными данными по оси ( контролер юзера )
}
if (accel == 0) // если крутящий момент равен нулю тоесть мы не давим на газ
{
foreach (WheelCollider col in WColBack) // перебираем колеса
{
col.brakeTorque = maxBrake; // передаем значение силы торможение
}
}
else // если пользователь давит на клавиши
{
foreach (WheelCollider col in WColBack) // перебираем колеса
{
col.brakeTorque = 0; // силу торможения ставим по нулям
col.motorTorque = accel * maxAccel; // увеличиваем крутящий момент
}
}
}
}
using System.Collections;
public class CarControler : MonoBehaviour
{
public WheelCollider[] WColForward; // масив с передними колесами
public WheelCollider[] WColBack; // масив с задними колесами
public Transform[] wheelF;
public Transform[] wheelB;
public float wheelOfSet= 0.1f;
public float wheelRadius = 0.13f;
public float maxSteer = 30; // макисмальный угол поворота колес
public float maxAccel = 25; // максимальный крутящий момент
public float maxBrake = 50; // максимальный тормозной момент
public class WheelData
{
public Transform wheelTransform;
public WheelCollider col;
public Vector3 wheelStartPos;
public float rotation = 0.0f;
}
protected WheelData[] wheels;
public Transform COM; // центр тяжести
void Start ()
{
rigidbody.centerOfMass = COM.localPosition; // устанавливаем центр массы
wheels = new WheelData[WColForward.Length+WColBack.Length];
for (int i = 0; i < WColForward.Length; i++)
{
wheels[i] = SetupWheels(wheelF[i], WColForward[i]);
}
for (int i = 0; i < WColBack.Length; i++)
{
wheels[i + WColForward.Length] = SetupWheels(wheelB[i],WColBack[i]);
}
}
private WheelData SetupWheels(Transform wheel, WheelCollider col)
{
WheelData result = new WheelData();
result.wheelTransform = wheel;
result.col = col;
result.wheelStartPos = wheel.transform.localPosition;
return result;
}
void FixedUpdate()
{
float accel = 0; // крутящий момент
float steer = 0; // угол поворота
accel = Input.GetAxis("Vertical"); // контролируем крутящий момент
steer = Input.GetAxis("Horizontal"); // контролируем угол поворота
CarMove(accel, steer); // передаем значение функции CarMove()
UpdateWheels();
}
private void UpdateWheels()
{ //11
float delta = Time.fixedDeltaTime; //12
foreach (WheelData w in wheels)
{ //13
WheelHit hit; //14
Vector3 lp = w.wheelTransform.localPosition; //15
if (w.col.GetGroundHit(out hit))
{ //16
lp.y -= Vector3.Dot(w.wheelTransform.position - hit.point, transform.up) - wheelRadius; //17
}
else
{ //18
lp.y = w.wheelStartPos.y - wheelOfSet; //18
}
w.wheelTransform.localPosition = lp; //19
w.rotation = Mathf.Repeat(w.rotation + delta * w.col.rpm * 360.0f / 60.0f, 360.0f); //20
w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.col.steerAngle, 90.0f); //21
}
}
private void CarMove(float accel, float steer) // принимаем значение кртящего момента и и поворота
{
foreach (WheelCollider col in WColForward) // перебираем все колеса
{
col.steerAngle = steer*maxSteer ; // поворачиваем колесо с полученными данными по оси ( контролер юзера )
}
if (accel == 0) // если крутящий момент равен нулю тоесть мы не давим на газ
{
foreach (WheelCollider col in WColBack) // перебираем колеса
{
col.brakeTorque = maxBrake; // передаем значение силы торможение
}
}
else // если пользователь давит на клавиши
{
foreach (WheelCollider col in WColBack) // перебираем колеса
{
col.brakeTorque = 0; // силу торможения ставим по нулям
col.motorTorque = accel * maxAccel; // увеличиваем крутящий момент
}
}
}
}