Jump to content
Unity Insider Forum

Loopings fahren mit AddForce ?


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 to post
Share on other sites

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));

;)

  • Like 1
Link to post
Share on other sites
vor 16 Minuten schrieb Sascha:

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));

 

Jo, das wars. Vielen Dank =D.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...