Jump to content
Unity Insider Forum

Charakter rutscht


Kojote

Recommended Posts

Hallo!

Ich habe gestern einen ziemlich üblen Fehler in meiner Steuerung gefunden. Ich lasse meinen Charakter springen, Problem ist, dass wenn er landet, er noch ein wenig weiter rutscht. Ich finde keinen Fehler und bisher hatte er das nie gemacht. Hier mal der Code für den Sprung:

zielPosition = new Vector3(Mathf.Round(this.transform.position.x), 1.0f, Mathf.Round(this.transform.position.z)) + transform.forward * 16;
sprungHoehe = 7.5f;
sprungVector = new Vector3(0, sprungHoehe, 0);
sprungRichtungskraft = 9.87f;
sprungRichtung = transform.forward * sprungRichtungskraft;
rigi.velocity = sprungVector + sprungRichtung;

Zielposition wird dann gesetzt, wenn er gelandet ist, da gibt es eine extra Coroutine, die überprüft ob er angekommen ist. Aber rein von diesem Code sollte er nur springen und landen, er rutscht aber nach. Oberflächenmaterialien nutze ich keine.

Hat einer eine Idee?

Grüße Kojote

 

EDIT: OK, einen Schritt bin ich schon weiter. Früher nutzte ich einen Box-Collider für den Charkter, jetzt einen Capsule-Collider. Stelle ich zurück auf Box geht alles wie gehabt und es gibt kein rutschen. Frage ist, wo ist der Fehler, da ich mit Capsule arbeiten muss.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du nutzt scheinbar einen Rigidbody, bewegst für den Sprung aber mit Transform. Machst du alle Bewegung über trasform, oder bewegst du auch über forces oder die Velocity?
Frier doch mal die X und Z Positionen vom RB bei den Constraints ein, wenn du nur über die Transformkomponente bewegst. Oder aber erhöhe den Dragwert vom RB.
Die Kapsel reibt nun mal vel weniger als die Box. Und auch wenn du kein physical Material nuztz, werden da irgendwelche Standardwerte für die Berechnung genutzt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich nutze nur für den Sprung den RB, ansonsten nur Transform. X und Y brachten keine Lösung. Falls du "rb.drag" meinsst, den habe ich schon auf 0 gesetzt.

OK, scheinen wirklich irgendwelche Startwerte zu sein, ich habe dem Charakter mal ein pysikalisches Material gegeben und "Dynamic Friction" sowie "Static Friction" auf 100 gestellt. Rutschen hört sofort auf. Hätte dieses Material nun einfluss auf Transform oder auf was hat dies nun alles Einfluss? Hab noch nie mit pysikalischen Materialien gearbeitet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Dragwert ist ein Simulierter Widerstand. Den gibt es einmal für seine Bewegung (Luftwiderstand) und einmal für seine Rotation.
Wenn du den auf 0 stellst, dann hast du keinen Widerstand (Weltraum). Stellst du den auf 1000 dann ist er irre hoch! Trotzdem kannst du natürlich den RB über forces in Bewegung oder Rotation bringen, er wird aber je nach Dragwert schneller oder weniger schnell abbremsen. Bei 0 würde er sich ewig weiterbewegen oder weiterdrehen, wenn er nicht mit irgendetwas kollidiert oder sich an etwas reibt. Bei einem sehr hohen Wert, würde er sofort stark abbremsen und man müsste viel Kraft aufwenden um ihn schnell zu bewegen.

Physikalische Materialien werden zu dem Drag dazu addiert, wenn der Körper über eine Fläche rollt oder rutscht. Jeder Collider hat ein physikalisches Material. Selbst wenn im Slot nichts drin ist, werden irgendwelche Werte genommen. Wie die Materialreibungen einberechnet werden, kannst du einstellen. Einmal stellst du natürlich ein, ob der Körper viel oder wenig Reibung hat, und dann stellst du zusätzlich noch ein, wie die Werte genutzt werden, also wie 2 oder mehr Körper sich gegenseitig beeinflussen sollen. Da kannst du sagen, dass der Mittelwert der Reibung, eine Multiplikation von beiden, der kleinste Reibungswert oder der größte Reibungswert der Körper genutzt werden soll.
Wenn z.B. ein Gummiklotz mit hoher Reibung auf einer Eisfläche rutschen soll, würde man wahrscheinlich einstellen, dass der minimale Reibungswert genommen werden soll. Soll ein Körper mit vielen Untergründen interagieren, wäre der Durchschnittswert wahrscheinlich die bessere Wahl.
 

Ob du nun bei deinem Spiel die Reibung eines Materials hoch stellst, den Dragwert hoch stellst, beim Auftreffen nach einem Sprung, einfach die Velocity des RB auf 0 stellst oder aber den RB in seinen Bewegungsachsen einfrierst, bleibt dir überlassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

OK, habe jetzt mal meinem Charakter ein physikalisches Material verpasst und den Wert 2 genommen, dass reicht um ihn zu bremsen, funktioniert schon mal. Frage wäre nun noch, diese Reibung würde nur bei physikalischen Bewegungen bzw. beim Fallen oder der gleichen funktionieren. Rein bei Bewegungen durch Transform würde diese Reibung nun nicht in Aktion treten oder doch? Durch Tests konnte ich nichts der gleichen merken, wollte aber trotzdem noch einmal nachharken, damit ich alles richtig verstehe. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast nicht verstanden, was das Positionsändern über die Transformkomponente denn eigentlich macht.
Kurze einfache Erklärung:
Bei Frame 1 ist der Charakter bei x=1. Bei Frame 2 ist der Charakter bei x=1.2. Einfach so, ohne Zwischenwert und ohne auf irgendwelche physikalische Besonderheiten zu achten. Denn du nutzt ja nichts physikalisches sondern nimmst ihn bei 1 weg und setzt ihn bei 1.2 hin. Puff - Pop! Wie beim Beamen! Du hebelst also alles was mit Physik zu tun hat aus.

Bewegst du physikalisch, dann gibst du dem Körper eine Geschwindigkeit oder übst eine Kraft auf ihn aus. Er hat jetzt also eine kinetische Energie, die ihn bewegt. Diese Energie kann über Dragwerte oder Reibungen abgebaut werden. Natürlich ist der Körper bei Frame 1 auch bei x=1 und bei Frame 2 bei x=1.2. Aber das was dazwischen gewesen wäre wurde jetzt physikalisch berechnet und kann Einfluß auf die weitere Geschwindigkeit oder Drehung haben.
Ein Physikalisches Material wirkt sich aber nur dann aus, wenn der Körper mit einen anderen Körper in Berührung ist. Wenn etwas fällt, berührt es nichts und dann wirkt auch nichts.
Lediglich der Drag-Wert wirkt immer bei einem RB. Egal ob der fällt fliegt, rollt oder rutscht. Aber natürlich nicht, wenn du ihn über die Transformkomponente irgendwo hin setzt, sondern nur, wenn er sich über die Physik bewegt. Hatte ein RB noch eine gewisse Velocity und du setzt ihn über Transform irgendwo hin, wird er sich nach dem Setzen in gleicher Geschwindigkeit weiterbewegen, wie beim Frame davor. Denn du hast an der Physik nichts geändert.

Klingelts?
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 23 Stunden schrieb malzbie:

Aber das was dazwischen gewesen wäre wurde jetzt physikalisch berechnet und kann Einfluß auf die weitere Geschwindigkeit oder Drehung haben.

Ein kleiner Zusatz: Nur, wenn "Collision Detection" auf "Continuous" ist, ansonsten interessiert sich der Rigidbody da auch herzlich wenig für.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...