Решил таки смастерить древний проект, задумывал давно все небыло времени заняться и вот начал. Суть сделать модель движения грузовика с прицепом, все кажется просто. но есть куча проблем которые немогу решить. Написал скрип чтобы колеса визуально крутились, на тягаче все относительно нормально а вот на прицепе после запуска они уезжают черти куда, плюс крутятся по разным осям, хотя в скрипте все сделано массивом. Ну и то что они прыгают это вопрос 2 (наверно крутятся относительно смещеного центра).
для начала хватит, и еще подскажите куда выложить проект чтобы можно было не жестами рассказывать и объяснять, а дать ссылку чтобы люди посмотрели что да как
вот примерно код на колеса прицепа:
Код
public class TruckWheelRotate : MonoBehaviour {
public Transform[] WCol;
public float RadiusWheels = 1;
public float WheelOffset = 0.1f;
public Vector3 shiftCentre = new Vector3(0.0f, -0.35f, 0.0f);//центр тяжести авто
class WheelData
{
public Transform transform;
public GameObject go;
public WheelCollider col;
public Vector3 StartPos;
public float Rotation = 0.0f;
public float MaxSteer;
public float BreackPoer;
public bool Motor;
}
private WheelData[] Wheels;
private WheelData SetWheelsParameter(Transform wheel, float maxSteer, float radius, bool motor)
{
if (wheel == null)
{ //если колесо не найдено то генерируем исключение
throw new System.Exception("Не найден входящий объект");
}
WheelData result = new WheelData(); // конструктор класса
GameObject GO = new GameObject("WheelCollider"); // создаем колайдер
GO.transform.parent = transform; // прицепляем колайдер к родителю
GO.transform.position = wheel.position; // позиция колайдера такая же как у колеса
WheelCollider col = (WheelCollider)GO.AddComponent(typeof(WheelCollider));//добавляем колайдер в проект
col.motorTorque = 0.0f; // начальная скорость кручения
col.brakeTorque = 0.0f; // начальная сила торможения
col.radius = radius;
result.transform = wheel;
result.go = GO;
result.col = col;
result.StartPos = GO.transform.localPosition;
result.MaxSteer = maxSteer;
result.Motor = motor;
return result;
}
// Use this for initialization
void Start () {
Wheels = new WheelData[WCol.Length];
//полный привод
for (int i = 0; i < WCol.Length; i++)
{
Wheels[i] = SetWheelsParameter(WCol[i], 0, RadiusWheels, true); //false для заднего привода
}
rigidbody.centerOfMass += shiftCentre;
}
// Update is called once per frame
void Update () {
WheelsUpdate();
}
public void WheelsUpdate()
{
float delta = Time.fixedDeltaTime;
foreach (WheelData w in Wheels)
{
WheelHit Hit;
Vector3 lp = w.StartPos;
if (w.col.GetGroundHit(out Hit))
{
lp.y -= Vector3.Dot(w.transform.position - Hit.point, transform.up) - RadiusWheels;
}
else
{
lp.y = w.StartPos.y - WheelOffset;
}
w.transform.localPosition = lp;
w.Rotation = Mathf.Repeat(w.Rotation + delta * w.col.rpm * 360.0f / 60.0f, 360.0f);
w.transform.localRotation = Quaternion.Euler(w.Rotation, w.col.steerAngle, 90.0f);
}
}
}