- Почему танк поворачивает при подъеме по склону и
- Почему танк так сильно скользит и скользит при спуске по склону и ускоряется, как ракета.
WheelColliders:
масса 500
радиус 0,275 - 0,35 (в зависимости от типа колеса основные колеса самые большие)
0,25 коэффициент демпфирования
0,3 расстояния подвески (задние и передние колеса имеют 0,01)
0 расстояние до точки приложения силы
центр 0, 0,2, 0 (0 для задней и передней части)
100 пружина
0 демпфер
0,4 целевое положение (1 для задней и передней части)
0,001 экстремальное и асимптотное скольжение как вперед, так и в сторону трение,
1 экстремум + значение асимптоты для обоих,
и, наконец, 1 жесткость вперед и 2,5 жесткость вбок.
Основной корпус RigidBody:
Масса 68000 (68 тонн, подходит для танка ИС7)
0 линейное демпфирование
0,5 угловое демпфирование (я пробовал 5, но проблема все еще сохраняется)
0, 0, 0 CoM (я много экспериментировал с этим, изменяя значение y на -0,4, но 0, 0, 0 кажется лучшим для большинства движений)
Включен автоматический тензор,
И, наконец, используется гравитация.
Большинство этих проблем связано с инспектором настройках, а не из кода.
Однако для перемещения твердого тела используется следующий код:
Код: Выделить всё
void Move()
move = Input.GetAxis("Вертикально");
Код: Выделить всё
if (AutoDrive != 0)
{
move = AutoDrive / 3f;
}
float slopeFactor = 1f;
float gravityAssistForce = 0f;
RaycastHit hit;
if (Physics.Raycast(transform.position + transform.up * 0.5f, -transform.up, out hit, 1.5f))
{
float slopeAngle = Vector3.Angle(hit.normal, Vector3.up);
Vector3 slopeDirection = Vector3.Cross(Vector3.Cross(hit.normal, Vector3.up), Vector3.up).normalized;
float uphillDot = Vector3.Dot(-hull.transform.forward, slopeDirection);
if (slopeAngle > 1f)
{
if (uphillDot > 0.1f) // Uphill
{
slopeFactor = 1f - (slopeAngle / 90f);
gravityAssistForce = -Mathf.Sin(slopeAngle * Mathf.Deg2Rad) * rb.mass;
}
else if (uphillDot < -0.1f) // Downhill
{
slopeFactor = 1f + (slopeAngle / 90f);
gravityAssistForce = Mathf.Sin(slopeAngle * Mathf.Deg2Rad) * rb.mass;
}
}
}
slopeFactor = Mathf.Clamp(slopeFactor, 0.1f, 2f);
effectiveMaxSpeed = maxSpeed * slopeFactor;
effectiveMaxReverseSpeed = maxReverseSpeed * slopeFactor;
if (move > 0)
{
currentSpeed = Mathf.Lerp(currentSpeed, effectiveMaxSpeed * 0.2f * move * totalGrounded, hpt / 100 * Time.deltaTime);
if (currentSpeed < 0) currentSpeed = Mathf.Lerp(currentSpeed, 0, 0.05f);
}
else if (move < 0)
{
currentSpeed = Mathf.Lerp(currentSpeed, -effectiveMaxReverseSpeed * 0.2f * -move * totalGrounded, hpt / 200 * Time.deltaTime);
if (currentSpeed > 0) currentSpeed = Mathf.Lerp(currentSpeed, 0, 0.05f);
}
else currentSpeed = Mathf.Lerp(currentSpeed, 0, 0.05f);
forward = -hull.transform.forward;
Vector3 forwardMotion = forward * currentSpeed;
// 4. Apply the driving force AND the gravity-assist force
// The gravityAssistForce is already factored by the tank's mass.
// It should be applied along the 'forward' direction, which is the direction of travel.
Vector3 totalForce = (forwardMotion - forward * Vector3.Dot(rb.linearVelocity, forward)) * totalGrounded;
// Convert the gravity assist force into a ForceMode.VelocityChange equivalent
// Since it's applied over Time.deltaTime in FixedUpdate: F = ma. We are adding F.
Vector3 gravityForceComponent = forward * (gravityAssistForce / rb.mass * Time.deltaTime);
rb.AddForce(totalForce + gravityForceComponent, ForceMode.VelocityChange);
if (Input.GetKeyDown(KeyCode.Space))
{
transform.rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0);
rb.linearVelocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;
rb.AddRelativeTorque(Vector3.zero);
}
speed = rb.linearVelocity.magnitude * 5;
Подробнее здесь: https://stackoverflow.com/questions/798 ... l-in-unity
Мобильная версия