Warum kommt es in Unity zu einer unerwünschten Rotation meines Panzers?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Warum kommt es in Unity zu einer unerwünschten Rotation meines Panzers?

Post by Anonymous »

Ich habe an diesem Panzerspiel gearbeitet und brauche Hilfe, um zwei Dinge herauszufinden:
  • Warum dreht sich der Panzer, wenn er Steigungen hinauffährt, und
  • Warum rutscht und rutscht der Panzer so stark, wenn er einen Hang hinunterfährt, und beschleunigt wie eine Rakete.
Hier sind meine Werte dafür WheelColliders und die Hauptkomponente von RigidBody am Rumpf:
WheelColliders:
  • 500 Masse
  • 0,275 - 0,35 Radius (je nach Radtyp sind die Haupträder am größten)
  • 0,25 Dämpfungsrate
  • 0,3 Aufhängungsabstand (hinten und Vorderräder haben 0,01)
  • 0 Kraftanwendungspunktabstand
  • Mitte 0, 0,2, 0 (0 für hinten und vorne)
  • 100 Feder
  • 0 Dämpfer
  • 0,4 Zielposition (1 für hinten und vorne)
  • 0,001 Extremum und asymptotischer Schlupf sowohl für vorwärts als auch seitwärts Reibung,
  • 1 Extremum + Asymptotenwert für beide,
  • und schließlich 1 Vorwärtssteifigkeit und 2,5 Seitwärtssteifigkeit.
Hauptrumpf Starrkörper:
  • 68000 Masse (68 Tonnen, geeignet für einen IS7-Panzer)
  • 0 linear Dämpfung
  • 0,5 Winkeldämpfung (ich habe 5 ausprobiert, aber das Problem besteht immer noch)
  • 0, 0, 0 CoM (Ich habe viel damit experimentiert und den Y-Wert auf -0,4 geändert, aber 0, 0, 0 scheint für die meisten Bewegungen am besten zu sein)
  • Automatischer Tensor aktiviert,
  • Und schließlich verwendet Schwerkraft.
Die meisten dieser Probleme sind auf die Inspektoreinstellungen zurückzuführen und nicht auf den Code.
Der Code, der zum Bewegen des starren Körpers verwendet wird, ist jedoch wie folgt:

Code: Select all

void Move()
{
move = Input.GetAxis("Vertical");

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;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post