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

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

Post by Guest »

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 (Hinter- 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 Extremwert und asymptotischer Schlupf sowohl für vorwärts als auch seitwärts Reibung,
1 Extremwert + Asymptotenwert für beide,
und schließlich 1 Vorwärtssteifigkeit und 2,5 Seitwärtssteifigkeit.
Hauptrumpf Starrer Körper:
68000 Masse (68 Tonnen, geeignet für einen IS7-Panzer)
0 lineare Dämpfung
0,5 Winkel Dä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 nutzt er die Schwerkraft.
Die meisten dieser Probleme stammen aus der Inspektoreinstellungen und nicht aus 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");

Code: Select all

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;
Vielen Dank, dass Sie die Textwand gelesen haben. Bitte kontaktieren Sie mich so schnell wie möglich.
Was muss ich zur weiteren Klärung hinzufügen??? Das macht mich wütend. Natürlich habe ich alles aufgelistet, was sich auf Drift und Reibung auswirkt

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post