колеса(4) прикреплены к осям Hinge Joint-ми;
оси прикреплены к кузову Spring Joint-ми(по 2 штуки на каждом);
между осями подобие кардана, в основном для жесткости конструкции. Прикреплен 2-мя Hinge Joint-ми к осям;
Ездить ее уже научил, работа подвески устраивает, но допилить есть куда.
Собственно проблема: не могу сделать корректный поворот передних колес.Когда едет еще более или менее, но когда стоит на одном месте, при повороте колес машинку начинает тянуть в какую-либо сторону, хотя силы к ней ни какие не прикладывал. Пока едешь все норм. В чем проблема понять не могу.
Что бы повернуть колеса на Joint-ах нужно: сначала разрешить поворот по У, затем повернуть и снова заблокировать его.
Код я написал сам, хоть и слаб в C#, потому и прошу помощи. Комментариев там наделал, думаю будет понятно.
Вот собственно сам код:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class drive : MonoBehaviour {
public Transform[] FrontWheels; //массив передних колес
public Rigidbody[] Wheelsrb; //массив физики всех колес
public HingeJoint[] WheelsHJ; //массив joint-ов на всех колесах
[Header("4x4")]
public bool WD; //выбор привода
[Header("Target&Force")]
public float tarvel; //крутящий момент мотора Joint-ов
public float force; //скорость мотора Joint-ов
public float angleRot; //угол поворота колес при повороте
private int i;
private int c;
private int a;
void Start ()
{
WD = false;
}
void FixedUpdate()
{
//движение вперед
if (Input.GetButton("Vertical"))
{
if (WD) //проверка полного привода
{
for (i = 0; i < WheelsHJ.Length; ++i)
{
JointMotor jm = WheelsHJ[i].motor; //временная переменая для мотора
jm.targetVelocity = tarvel;
jm.force = force;
WheelsHJ[i].motor = jm;
WheelsHJ[i].useMotor = true; //после назначения переменных включаем двигл.
c = 1;
}
}
else //только задний привод
{
for (i = 2; i < WheelsHJ.Length; ++i)
{
JointMotor jm = WheelsHJ[i].motor;
jm.targetVelocity = tarvel;
jm.force = force;
WheelsHJ[i].motor = jm;
WheelsHJ[i].useMotor = true;
c = 1;
}
}
} else
{
if (c == 1) //если не нажата кнопка движения проверяем, работал ли мотор
{
for (i = 0; i < WheelsHJ.Length; ++i)
{
WheelsHJ[i].useMotor = false; //отключаем мотор у всех колес, без исключения
c = 0;
}
}
}
//поворот передних колес
if (Input.GetButton("Horizontal"))
{
for (i = 0; i < 2; ++i)
{
WheelsHJ[i].axis = new Vector3(1, 1, 0); //разрешаем поворот по Y у HingJoint
FrontWheels[i].localRotation = Quaternion.Euler(Vector3.up * angleRot * Input.GetAxis("Horizontal")); //поворачиваем до нужного градуса
WheelsHJ[i].axis = new Vector3(1, 0, 0); //поле поворота запрещаем поворот по Y у HingJoint
a = 1;
}
} else
{
if (a == 1)
{
for (i = 0; i < 2; ++i)
{
WheelsHJ[i].axis = new Vector3(1, 1, 0); //разрешаем поворот по Y у HingJoint
FrontWheels[i].localRotation = Quaternion.Euler(Vector3.up * 0); //обнуляем градусы
WheelsHJ[i].axis = new Vector3(1, 0, 0); //поле поворота запрещаем поворот по Y у HingJoint
a = 0;
}
}
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class drive : MonoBehaviour {
public Transform[] FrontWheels; //массив передних колес
public Rigidbody[] Wheelsrb; //массив физики всех колес
public HingeJoint[] WheelsHJ; //массив joint-ов на всех колесах
[Header("4x4")]
public bool WD; //выбор привода
[Header("Target&Force")]
public float tarvel; //крутящий момент мотора Joint-ов
public float force; //скорость мотора Joint-ов
public float angleRot; //угол поворота колес при повороте
private int i;
private int c;
private int a;
void Start ()
{
WD = false;
}
void FixedUpdate()
{
//движение вперед
if (Input.GetButton("Vertical"))
{
if (WD) //проверка полного привода
{
for (i = 0; i < WheelsHJ.Length; ++i)
{
JointMotor jm = WheelsHJ[i].motor; //временная переменая для мотора
jm.targetVelocity = tarvel;
jm.force = force;
WheelsHJ[i].motor = jm;
WheelsHJ[i].useMotor = true; //после назначения переменных включаем двигл.
c = 1;
}
}
else //только задний привод
{
for (i = 2; i < WheelsHJ.Length; ++i)
{
JointMotor jm = WheelsHJ[i].motor;
jm.targetVelocity = tarvel;
jm.force = force;
WheelsHJ[i].motor = jm;
WheelsHJ[i].useMotor = true;
c = 1;
}
}
} else
{
if (c == 1) //если не нажата кнопка движения проверяем, работал ли мотор
{
for (i = 0; i < WheelsHJ.Length; ++i)
{
WheelsHJ[i].useMotor = false; //отключаем мотор у всех колес, без исключения
c = 0;
}
}
}
//поворот передних колес
if (Input.GetButton("Horizontal"))
{
for (i = 0; i < 2; ++i)
{
WheelsHJ[i].axis = new Vector3(1, 1, 0); //разрешаем поворот по Y у HingJoint
FrontWheels[i].localRotation = Quaternion.Euler(Vector3.up * angleRot * Input.GetAxis("Horizontal")); //поворачиваем до нужного градуса
WheelsHJ[i].axis = new Vector3(1, 0, 0); //поле поворота запрещаем поворот по Y у HingJoint
a = 1;
}
} else
{
if (a == 1)
{
for (i = 0; i < 2; ++i)
{
WheelsHJ[i].axis = new Vector3(1, 1, 0); //разрешаем поворот по Y у HingJoint
FrontWheels[i].localRotation = Quaternion.Euler(Vector3.up * 0); //обнуляем градусы
WheelsHJ[i].axis = new Vector3(1, 0, 0); //поле поворота запрещаем поворот по Y у HingJoint
a = 0;
}
}
}
}
}