Jump to content
Unity Insider Forum

Charakter fliegt


Kojote

Recommended Posts

Grüße!

Ich bastel nun schon den halben Tag an der Sprungsteuerung. Der Charakter, muss man vorher sagen, läuft von allein, der Spieler macht also keine Eingabe!

Wenn der Charakter auf eine Sprungbodenplatte kommt wird per OnTriggerEnter eine Methode aufgerufen:

private void aktionStarten()  {
   if (aktion == typ.Sprung_Standard) {
      zielPosition = this.transform.position + transform.forward * 2;
      coroutine = SprungStandardCoroutine();
      StartCoroutine(coroutine);
   }
}

Danach wird diese Coroutine gestartet:

// ------------------------------------------------------------------------------------
// SPRUNG SCHALTER
// ------------------------------------------------------------------------------------

// Ueberpruefung aller 0.05 Sekunden ob die Zielposition erreicht wurde
private IEnumerator SprungSchalterCoroutine() {
   aktionSprungSchalter = true;
   bool sprungSchalterBeenden = false;
   animator.SetBool("isJump", true);
   do {
      yield return new WaitForFixedUpdate();
      sprungSchalterBeenden = SprungSchalterCheck();
   } while (!sprungSchalterBeenden);
   aktionSprungSchalter = false;
   transform.position = zielPosition;
   aktion = typ.STOP;
   animator.SetBool("isIdle", true);
   animator.SetBool("isRun", false);
   animator.SetBool("crippled", false);
}

// Pruefen ob das Ziel erreicht wurde
private bool SprungSchalterCheck() {
   if (Vector3.Distance(this.transform.position, zielPosition) > 0.03f) {
      return false;
   } else {
      return true;
   }
}

In der FixedUpdate passiert dann das:

private void FixedUpdate() {   
   if (aktionSprungSchalter) {
      sprungHoehe = 2.3f;
      sprungVector = new Vector3(0, sprungHoehe, 0);
      sprungRichtungskraft = 0.20f;
      sprungRichtung = transform.forward * sprungRichtungskraft;
      rigi.velocity = sprungVector + sprungRichtung;
      transform.position = Vector3.MoveTowards(transform.position, zielPosition, charakterLaufgeschwindigkeit * Time.deltaTime);
   }
}

Problem ist nun, dass wenn ich die Sprunghoehe und die Richtungskraf zu klein einstelle, ist es nur ein kleines hopsen, springt eine Parabel, aber nach ungefähr 2/3 des Flugwegs sinkt er nur noch ganz langsam nach unten, irgendwas hindert ihn am schnellen sinken.

Stelle ich nun die Sprunghöhe und die Richtungskraft höher ein, wird auch die Parabel höher und besser, jedoch sinkt der Charakter nicht mehr nach unten, sondern schwebt nach ca. der hälfte des Flugwegs immer weiter nach oben.

Ich habe es nun mit Gegenkräften versucht, z.B. rigi.AddForce(transform.up * 7000). Damit kann ich zwar genug Kraft entwickeln um ihn schnell wieder auf den Boden zu holen, jedoch nur mit sehr hohen Kräften (7000 und mehr up). Wenn ich das mache, wird aber die Parabel aber wieder zu kurz und er springt nicht die angegebene Strecke.

Rigidbody hat er, Masse 100, Drag 0, Angular Drag 0.05, er benutzt Gravity und ist nicht Kinematic. Er nutzt Box Collider, falls das wichtig ist.

Habt ihr ne Idee?

Danke schon mal, Kojote

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Probier mal die Modifikation der Position des Transform während des Sprunges auszusetzen, über das ständige  Neusetzen der Position störst du die physikalischen Kräfte auf den RB. Die aktuelle Vorwärtsbewegung in dem Fall mit in die Sprungrichtung einbauen und "transform.position= .." dafür Aussetzen. Du hast ja eine Vorwärtsbewegung bereits über die Sprungrichtung gesetzt und wenn du Position des Transform noch einmal umschießt störst du damit die Flugparabel des Sprungs.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

@Zer0Cool Wenn ich dich jetzt richtig verstehe:

if (aktionSprungSchalter) {
   sprungHoehe = 1.3f;
   sprungVector = new Vector3(0, sprungHoehe, 0);
   sprungRichtungskraft = 0.10f;
   sprungRichtung = transform.forward * sprungRichtungskraft;
   rigi.velocity = sprungVector + sprungRichtung;
   transform.position = Vector3.MoveTowards(transform.position, zielPosition, charakterLaufgeschwindigkeit * Time.deltaTime);
}

Diese Zeile ausklammern oder nach einem Durchgang sperren:

transform.position = Vector3.MoveTowards(transform.position, zielPosition, charakterLaufgeschwindigkeit * Time.deltaTime);

Klappt nicht, dabei fliegt er jedoch gleich nach oben. Änder ich die Sprungrichtungskraft, springt er zwar vernümpftiger, jedoch fliegt mir wieder los.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum vermischst du Transformbewegungen und Rigidbody-Kräfte?
Das ist niemals gut, weil sie sich schlecht verbinden lassen.
Entweder alles über die Physik machen, also mit Velocity oder Force, oder alles ohne Physik machen. Und wenn du ohne Physik arbeitest, dann musst du eben erst einen Vector2 oder Vector3 bilden in dem dann die Lauf- und Sprungbewegung addiert werden und dann der Transformkomponente übergeben werden.

In beiden Szenarien hast du deine Laufbewegung und deine Sprungbewegung wird einfach dazu addiert. Der Sprung bezieht sich ja auch nur auf die Y Achse.
Würdest du also über Force bewegen, dann addierst du eine die Sprung-Force (Nur Y Achse) hinzu. Machst du das über Velocity, dann liest du erst die momentane Velocity aus, übergibst sie einer Vector3 Variable, addierst dieser Variable einen Y Wert hinzu und übergibts das Ganze als mit rb.velocity auf deinen Rigidbody zurück.

Machste das nur über Transformbewegungen, dann musst du dir einfach eine kleine Routine bauen, die die Schwerkraft simuliert also die 9,81m/s immer dazu addiert, solang er in der Luft ist. (Da y nach unten hin größer wird, musst du also ins Negative gehen.
yRichtung-=9.81*Time.deltaTime;
Das machste aber eben nur, wenn die Figur in der Luft ist. Sobald er den Boden berührt, ziehst du nichts mehr ab sondern setzt yRichtung auf 0, damit er nicht nach unten durch fällt.
Und um zu springen, gibst du yRichtug einfach einmalig einen positiven Wert. Das ist ja nichts anderes als hättest du einmalig eine Force gegeben.

Ja und das Ganze addierst du einfach: Erst Vector3 MoveToward errechnen, das einer Vector3 Variable übergeben, dann den Wert der yAchse dieser V3 Variable dazuaddieren, und erst jetzt alles der Transformkomponente übergeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab den Fehler gefunden. Zum einen stimmt, Transformbewegungen haben beim Ridgit nix zu suchen. Zweites Problem war, ich habe das Script in die Fixed Update Methode gepackt. Dadurch hat er bei jeder neuen Runde des Fixed Update wieder die Sprungkraft bekommen. Somit konnte er also nie landen. Packe ich das Script in eine Methode springt er fabelhaft!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...