Jump to content
Unity Insider Forum

Loopings fahren mit AddForce ?


Mino1337

Recommended Posts

Hallo,

 

ich habe ein 2D Spiel in dem man durch Loopings fahren kann. Ich habe ein Looping gemalt, als PNG gespeichert und das ganze als Asset importiert. Am Ende gab ich dem ganzen einen Polygon Collider damit meine Spielfigur den Untergrund als befahrbar wahrnimmt.

Das befahren funktioniert auch ganz gut aber immer wenn die Figur ganz oben ist also um 180 Grad gedreht fährt sie nicht weiter. Sie bleibt also am Scheitelpunkt des Loopings stehen. Das Beschleunigen habe ich mit

rb.AddForce(transform.right * 1.5f, ForceMode2D.Impulse);

gelöst. Ich habe auch AddRelativeForce versucht aber das klappt noch weniger, die Figur fliegt im Looping wild umher.

im Prinzip will ich das der Fahrer die Kraft immer im Rücken hat egal wie er gedreht ist, deswegen habe ich auch folgendes versucht:

            Vector3 dir = Quaternion.AngleAxis(transform.eulerAngles.z, Vector3.forward) * Vector3.right;
            //Beschleunigung
            if (rb.velocity.x < maxmaleBeschleunigungXGas)
            {
                    rb.AddForce(dir * 1.5f, ForceMode2D.Impulse);
            }

Das klappt alles nichtmehr sobald die Figur um 180 Grad gedreht ist.

 

Hier mein ganzer Code:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{

    public Sprite stand;
    public Sprite idle;

    public int maximaleBeschleunigungY;
    public int minimaleBeschleunigungY;
    public int minimaleBeschleunigungX;
    public int maxmaleBeschleunigungX;
    public int maxmaleBeschleunigungXGas;
    public int minimaleBeschleunigungRampe;
    public int maximaleBeschleunigungSand;
    public int maximaleBeschleunigungBeschleunigungsstreifen;

    private float Zeit = -1000;

    private Rigidbody2D rb;
    private bool gas_btn_pressed;
    private bool aufstellen_btn_pressed;
    private bool aufBoden;
    private bool RampeOhneGas;
    private bool SandMitGas;
    private bool Beschleunigung;
    private int Pokale;
    private int Medallien;
    private RaycastHit2D hit;

    private void OnTriggerStay2D(Collider2D collision)
    {
        if (collision.tag == "Floor" ||
            collision.tag == "SchraegFloor" ||
            collision.tag == "Rampe" ||
            collision.tag == "Sand" ||
            collision.tag == "Beschleunigungsstreifen")
        {
            aufBoden = true;
           // print("Boden");
        }

        if (collision.tag == "SchraegFloor")
        {
            rb.AddForce(-transform.up * 0.8f, ForceMode2D.Impulse);
        }

        if (collision.tag == "Rampe" && !gas_btn_pressed)
        {
            RampeOhneGas = true;
            //print("Rampe");
        }
        else
        {
            RampeOhneGas = false;
        }

        if (collision.tag == "Sand" && gas_btn_pressed)
        {
            SandMitGas = true;
            // print("Sand");
        }
        else
        {
            SandMitGas = false;
        }

        if (collision.tag == "Beschleunigungsstreifen")
        {
            Beschleunigung = true;
            // print("Beschleunigung");
        }
        else
        {
            Beschleunigung = false;
        }

    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Floor" ||
            collision.tag == "SchraegFloor" ||
            collision.tag == "Rampe" ||
            collision.tag == "Sand" ||
            collision.tag == "Beschleunigungsstreifen")
        {
            aufBoden = true;
            // print("Boden");
        }

        if (collision.tag == "Rampe" && !gas_btn_pressed)
        {
            RampeOhneGas = true;
            // print("Rampe");
        }
        else
        {
            RampeOhneGas = false;
        }

        if (collision.tag == "Sand" && gas_btn_pressed)
        {
            SandMitGas = true;
            // print("Sand");
        }
        else
        {
            SandMitGas = false;
        }

        if (collision.tag == "Beschleunigungsstreifen")
        {
            Beschleunigung = true;
            // print("Beschleunigung");
        }
        else
        {
            Beschleunigung = false;
        }

        if (collision.tag == "Pokal")
        {
            Pokale = Pokale + 1;
            Destroy(collision.gameObject);
             print(Pokale);
        }

        if (collision.tag == "Medallie")
        {
            Medallien = Medallien + 1;
            Destroy(collision.gameObject);
            print(Medallien);
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.tag == "Floor" ||
            collision.tag == "SchraegFloor" ||
            collision.tag == "Rampe" ||
            collision.tag == "Sand" ||
            collision.tag == "Beschleunigungsstreifen")
        {
            aufBoden = false;
            //print("Luft");
        }
    }
    /*
    void Btn_gas()
    {
        gas_btn_pressed = true;
    }

    void Btn_keingas()
    {
        gas_btn_pressed = false;
    }

    void Btn_aufstellen()
    {
        aufstellen_btn_pressed = true;
    }

    void Btn_keinaufstellen()
    {
        aufstellen_btn_pressed = false;
    }
    */
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

     void Update()
    {
        if (Input.GetKeyDown(KeyCode.Y))
        {
            Zeit = Time.timeSinceLevelLoad;
        }

        if (Input.GetKeyDown(KeyCode.X))
        {
            gas_btn_pressed = true;
        }
        if (Input.GetKeyUp(KeyCode.X))
        {
            gas_btn_pressed = false;
        }
    }

     void FixedUpdate()
    {


        hit = Physics2D.Raycast(transform.position, -transform.up, 5F);
        if (hit.collider.tag != "KeinAusrichten")
        {
            transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
        }
        

        if (RampeOhneGas)
        {
            //Maximale Geschwindigkeit auf x und y
            rb.velocity = new Vector2(Mathf.Clamp(rb.velocity.x, minimaleBeschleunigungRampe, maxmaleBeschleunigungX), Mathf.Clamp(rb.velocity.y, minimaleBeschleunigungY, maximaleBeschleunigungY));
        } else if (SandMitGas) {
            //Maximale Geschwindigkeit auf x und y
            rb.velocity = new Vector2(Mathf.Clamp(rb.velocity.x, minimaleBeschleunigungX, maximaleBeschleunigungSand), Mathf.Clamp(rb.velocity.y, minimaleBeschleunigungY, maximaleBeschleunigungY));
        } else if (Beschleunigung)
        {
            //Maximale Geschwindigkeit auf x und y
            rb.velocity = new Vector2(Mathf.Clamp(rb.velocity.x, maximaleBeschleunigungBeschleunigungsstreifen, maxmaleBeschleunigungX), Mathf.Clamp(rb.velocity.y, minimaleBeschleunigungY, maximaleBeschleunigungY));
        }
        else
        {
            rb.velocity = new Vector2(Mathf.Clamp(rb.velocity.x, 0, rb.velocity.x), Mathf.Clamp(rb.velocity.y, minimaleBeschleunigungY, maximaleBeschleunigungY));
        }




        if (gas_btn_pressed)
        {
            Vector3 dir = Quaternion.AngleAxis(transform.eulerAngles.z, Vector3.forward) * Vector3.right;
            //Beschleunigung
            if (rb.velocity.x < maxmaleBeschleunigungXGas)
            {
                    rb.AddForce(dir * 1.5f, ForceMode2D.Impulse);
            }
            
        }

        if (!gas_btn_pressed && aufBoden && rb.velocity.x > minimaleBeschleunigungX)
        {
            //negative Beschleunigung
            rb.AddForce(new Vector2(-1.0f, 0), ForceMode2D.Impulse);
        }

        if (!aufBoden)
        {
            //transform.eulerAngles = new Vector3(0, 0, 15);
            this.gameObject.GetComponent<SpriteRenderer>().sprite = stand;

        }

        if (!aufstellen_btn_pressed)
        {
            this.gameObject.GetComponent<SpriteRenderer>().sprite = idle;

        }

        if (Time.timeSinceLevelLoad-Zeit<1.0f)
        {

            Vector3 dir = Quaternion.AngleAxis(transform.eulerAngles.z, Vector3.forward) * Vector3.right;

            //transform.eulerAngles = transform.eulerAngles + new Vector3(0, 0, 15);
            if (rb.velocity.x<40)
            {
                rb.AddForce(dir * 10.0f, ForceMode2D.Impulse);
                //rb.AddRelativeForce(rb.transform.right * 10.0f, ForceMode2D.Impulse);
            }
            //this.gameObject.GetComponent<SpriteRenderer>().sprite = stand;
        }

        print(transform.eulerAngles.z);
    }

}

Einige Versuche habe ich auskommentiert weil sie im Moment nicht relevant sind.

 

Hat da jemand eine Idee ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eigentlich ist AddForce mit Transform.right schon die richtige Lösung. Damit geht's immer nach Rechts aus sicht des Autos (was ja "vorne" sein dürfte). ForceMode.Impulse ist etwas unpassend für eine konstante Beschleunigung, sollte aber absolut egal sein.

Ich tippe mal ganz stark auf

rb.velocity = new Vector2(Mathf.Clamp(rb.velocity.x, 0, rb.velocity.x), Mathf.Clamp(rb.velocity.y, minimaleBeschleunigungY, maximaleBeschleunigungY));

;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...