Как мне добиться, чтобы мой танк хорошо вращался в Unity? [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Как мне добиться, чтобы мой танк хорошо вращался в Unity? [закрыто]

Сообщение Anonymous »

Я работаю над этой танковой игрой, и мне нужна помощь в выяснении двух вещей:
  • Почему танк поворачивает при подъеме по склону и
  • Почему танк так сильно скользит и скользит при спуске по склону и ускоряется, как ракета.
Вот мои ценности для игры WheelColliders и основной компонент RigidBody на корпусе:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»