Jump to content
Unity Insider Forum

Z Rotation Limit


Rasmusen

Recommended Posts

Hallo , ich mache gerade ein Jump and Run , aber ich habe ein Problem . Wenn mein kleiner Fuchs beim laufen von einer Klippe fällt, dann rotiert er und landet je nach tiefe auf dem Rücken. Ich kann aber die Z Axe nicht freezen weil er schon auch ein bischen wenigstens nach oben und unten laufen sollte auf dem Ground . Damit meine ich das er wenn er Bergauf geht dann auch ruhig sich dem Boden entsprechend rotieren sollte. Aber er sollte einfach limitiert rotieren dürfen. Hat da jemand ein Codebeispiel für mich ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja also bisher dreht er sich gemäß dem Ground auch korrekt . Also wenn der kleine Fuchs Bergauf läuft dreht er sich so das vordere und hintere Beinchen den Boden korrekt berühren. Es wurde ein Rigidbody 2D und ein Poly Collider 2D hinzugefügt. Und ein Script welches den Fuchs nach vorne bewegt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du weißt, welche min und max Winkel da sein dürfen, dann kannst du Mathf.Clamp dafür prima nutzen.

 

float myZ = Mathf.Clamp(transform.eulerAngles.z,-40f,40f);
transform.eulerAngles= new Vector3(transform.eulerAngles.x,transform.eulerAngles.y,myZ);

Link zu diesem Kommentar
Auf anderen Seiten teilen

OK danke das hört sich gut an , aber wie weise ich das meinem vorhandenen Rigidbody2D zu ? Weil mit dem Code den Du mir gepostet hast besteht ja noch kein zusammenhang mit meinem RigidBody2D. Ja mag sein das das eine Noobfrage ist aber ich habe noch nicht sehr viel erfahrung wie ich gerade merke. Scheinbar ist bringt es nicht viel das ich dauernd Tutorials mache weil ich Grundfunktionen nicht verstehe. Das ist echt voll Schade .

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok , aber es zeigt keine Wirkung obwohl kein Error vorliegt. Folgendes Script habe ich auf dem Player liegen :

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PlayerJump : MonoBehaviour {
   public GameObject turretRotateObj;
   public float maxTowerRotation = 130.0f;
   public float angle = 45.0f;

   [serializeField]
   private AudioClip jumpClip;
    private float jumpForce = 8f, forwardForce = 0f;
   private Rigidbody2D myBody;

   private bool canJump;
   private Button jumpBtn;

   // Use this for initialization
   void Awake () {
    myBody = GetComponent<Rigidbody2D>();
    jumpBtn = GameObject.Find("Jump Button").GetComponent<Button>(); ;
    jumpBtn.onClick.AddListener(() => Jump());
}

// Update is called once per frame
void Update () {
    float myZ = Mathf.Clamp(transform.eulerAngles.z, -1f, 1f);
    transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, myZ);
    if (Mathf.Abs(myBody.velocity.y) <= 0)
    {
	    canJump = true;
    }

    }
   void OnCollisionEnter2D(Collision2D target)
   {
    if (target.gameObject.tag == "Obstacle")
    {
	    canJump = true;
    }
   }
   public void Jump()
   {
    if (canJump)
    {
	    if (transform.position.y > -2.8)
	    {
		    canJump = false;
	    }

	    if (transform.position.x < 0)
	    {
		    forwardForce = 0.7f;
	    } else
	    {
		    forwardForce = 0.7f;
	    }
	    myBody.velocity = new Vector2(forwardForce, jumpForce);

    }
   }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach so, du machst das ja in 2D.

Da bietet es sich wahrscheinlich sogar an, den Körper über den RB zu steuern, da er ja in der Rotation auch nur die Z Achse hat.

also nutzt du in der Mathf.Clamp einfach myBody.Rotation.

Man kann in 2D und auch in 3D die Position und Rotation auch über den RB steuern, anstatt über Transform (Wenn ein RB da ist). Es ist sogar etwas besser, da sich bei Manipulation vom Transform die Physik ersteinmal drauf einstellen muss und etwas Performance kostet, was beim direkten manipulieren vom RB nicht passiert.

 

Trotzdem hast du ja noch einen Drehimpuls, den du über angularVelocity auf 0 setzen kannst, sobald Min oder Max erreicht wurde.

In der Regel reicht aber ein hoher Dragwert und schon bremst der RB ganz stark die eigene Rotation ab.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok hab nun ein bischen dran rum probiert und die Anhaltspunkte sind schon mal gut und damit kann ich auch weiter machen. Bei dem Scriptcode Malzbie verhält es sich so das der Fuchs den Berghoch läuft und auch korrekt rotiert. Aber sobald die Z Achse in den Minus Bereich geht macht der Fuchs dauerhaft so Kopf nach oben Bewegungen und Stuttert vor sich hin. Also Berg runter läuft er dann nicht mehr korrekt . Ich werd aber die Sache nun noch in eine Schleife packen damit ich das besser Kontrollieren kann. Jedenfalls hat das einen rießen Lerneffekt und danke euch. Achso und Malzbie ich hab dein Script auf Rigidbody2d geändert ... hoffentlich hatte ich das richtig verstanden :

float myZ = Mathf.Clamp(GetComponent<Rigidbody2D>().transform.eulerAngles.z, -20f, 60f);
    GetComponent<Rigidbody2D>().transform.eulerAngles = new Vector3(GetComponent<Rigidbody2D>().transform.eulerAngles.x, GetComponent<Rigidbody2D>().transform.eulerAngles.y, myZ);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...