Wie kriege ich dieses Unity2D Touch/Swipe-Jump-Movement-Problem gelöst?

Hallo,

ich programmiere zur Zeit ein Unity2D-Spiel jedoch ist gerade ein Problem aufgetreten, welches ich vermutlich nicht allein lösen kann.

Und zwar habe ich in meinem Spiel eine Swipe-Mechanik eingebaut, die mit einem Rigidbody sowie einem Vector2 funktioniert und eine Sprungmechanik, wo der Charakter konstant am Springen ist.

Das Problem ist aber, dass beides mit einem Rigidbody und einem Vector2 nicht/funktioniert. Dies führt dazu, dass, wenn ich die Swipe-Mechanik, der Character so unschön nach unten gezogen wird.

Ich füge mal den Code für ein besseres Verständnis ein:

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

public class PlayerMovement : MonoBehaviour
{
  public float jumpForce;
  float currentJumpForce;
  private bool isGrounded;
  Vector2 startPos;
  Vector2 movedPos;
  Vector2 endPos;
  public float speed;
  public Rigidbody2D rb;
  bool isTouch;

  // Start is called before the first frame update
  void Start()
  {
    currentJumpForce = jumpForce;
  }

  // Update is called once per frame
  void Update()
  {
    if (Input.touchCount > 0)
    {
      Touch touch = Input.GetTouch(0);
      
      switch(touch.phase)
      {
        case TouchPhase.Began:
          startPos = touch.position;
          isTouch = false;
          break;
        case TouchPhase.Moved:
          movedPos = touch.position;
          print(movedPos - startPos);
          isTouch = true;
          break;
      }
    }
  }

  void FixedUpdate()
  {
      if (isGrounded) <----- Sprung-Mechanik
      {
        rb.velocity = Vector2.up * currentJumpForce;
        isGrounded= false;
      }

      if (isTouch) <------ Swipe-Mechanik
      {
        if (startPos.x < movedPos.x)
        {
          rb.velocity = new Vector2(speed, 0); <----- Hier muss ich eine x- und y-Achse angeben. Jedoch führt der "0"-Wert dazu, dass der Character nach unten gedrückt wird (sehr langsam nach unten fällt)(Das liegt daran dass die Sprung-Machnik ebenfalls mit einem Rigidbody und Vector2 funktioniert und somit dann der Sprungwert auf "0" gesetzt wird!
        }
        else if (startPos.x > movedPos.x)
        {
          rb.velocity = new Vector2(-speed, 0);
        }

        isTouch = false;
      }
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
      istap = true;
    }
  }

Könnte mir jemand bitte eine Alternative zu der Sprung- oder Swipe-Mechanik schreiben?

PS: PhysicsMaterial2D klappt nicht, da der Charakter immer höher Springt.

Computer, Schule, Programmieren, Programmierung, CSharp, Spieleentwicklung, Unity, Unity2D
2 Antworten
Wie kann ich Text in einer Variable in C# speichern, ohne ihn zu entfernen, wenn ich zurück in die Main Methode komme?

Hey, ich habe vor ein paar Tagen angefangen C# zu lernen und versuche nun einige einfache Programme für Anfänger zu programmieren. Der Taschenrechner hat schon funktioniert jedoch scheitert es jetzt bei einem Schreibprogramm, was den Text temporär in einer Variable der Konsole speichern soll und wieder aufrufbar ist.

Am Anfang meine Codes, habe ich 4 String Variablen als Speicherplatz festgelegt. Wie diese aussehen, sieht man auf dem Bild.

Nun muss der Nutzer angeben, ob er einen neuen Text speichern oder ein vorhandenes Dokument öffnen will. Will er ein neues speichern wird mit Hilfe einer If-Abfrage geschaut, welche von den 4 Variablen noch leer ist.

...darunter sind mit "else if" noch die anderen Speicherplätze festgelegt.

Nach einer Eingabe wird der Text in dem String gespeichert und man gelangt zurück zur Main Methode, wo dann allerdings wieder das, was in die Variable eingetragen wurde gelöscht wird, da ich den Variablen ja einen Startwert zuweisen musste. (sieht man auf dem Bild) ich kann die variablen auch nicht später der Eingabe direkt zuweisen, da die Konsole erst überprüfen muss, welche Variable noch frei ist.

Ich hoffe es ist verständlich, was mein Problem ist und jemand kann mir weiterhelfen.

Vielen Dank schon mal im Voraus!

Wie kann ich Text in einer Variable in C# speichern, ohne ihn zu entfernen, wenn ich zurück in die Main Methode komme?
Computer, Technik, Programmieren, CSharp, Technologie, Computerprogramm
3 Antworten
Warum kommt ein Fehler [Unity, Csharp]?

Wieso kommt bei meinem Script ein Fehler? Was hat er gegen die Zeile:

Animator.SetTrigger("Los");

Fehler:

Fehler CS0120 Für das nicht statische Feld, die Methode oder die Eigenschaft "Animator.SetTrigger(string)" ist ein Objektverweis erforderlich.

Warum geht das den jetzte nicht, ich benutze dieses Script oft (natürlich immer abgeändert), aber jetzt hat er ein problem mit Animationen. Der Artikel dazu macht mich iwie nicht schlauer :/

Script:

{

  public int HPFlaggeBlau = 100;

  public int CurrentHPFlaggeBlau { get; private set; }

  Animator animator;

  private void Start()

  {

    animator = GetComponentInChildren<Animator>();

  }

  private void Awake()

  {

    CurrentHPFlaggeBlau = HPFlaggeBlau;

  }

  void OnTriggerEnter(Collider Collider)

  {

    if (Collider.gameObject.tag == "RotSchwertWaffe")

    {

      TakeDamage(1);

    }

  }

  public void TakeDamage(int Schaden)

  {

    Schaden = Mathf.Clamp(Schaden, 0, int.MaxValue);

    CurrentHPFlaggeBlau -= Schaden;

    Debug.Log(transform.name + " takes " + Schaden + "Schaden.");

    if (CurrentHPFlaggeBlau <= 0)

    {

      Animator.SetTrigger("Los");

      StartCoroutine("Die");

    }

  }

  IEnumerator Die()

  {    

    yield return new WaitForSeconds(3);

    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex - 1);

  }

}

Computer, Animation, Schule, Technik, Programmieren, CSharp, Logikfehler, Unity, Spiele und Gaming
1 Antwort
Meine Truppen bekommen keinen Schaden [Unity, CSharp]?

Hallo,

in meinem Spiel wo es eine Blaue und Rote Seite gibt, bekommen meine Truppen keinen Schaden! Woran könnte das liegen, für mich ergibt die Fehlermeldung keinen richtigen Sinn, ich mein eine Collision findet statt und der Soldat soll Schaden bekommen.

Fehlermeldung:

NullReferenceException: Object reference not set to an instance of an object

EnemyStatsRot.TakeDamage (System.Int32 Schaden) (at Assets/EnemyStatsRot.cs:27)

EnemyStatsRot.OnTriggerEnter (UnityEngine.Collider Collider) (at Assets/EnemyStatsRot.cs:21)

public class EnemyStatsRot : MonoBehaviour

{

  public int maxHealthGegner = 30;

  public int currenthealthGegner { get; private set; }

  public Stat Rüstung;

  private void Awake()

  {

    currenthealthGegner = maxHealthGegner;

  }

  void OnTriggerEnter(Collider Collider)

  {

    if (Collider.gameObject.tag == "BlauSchwertWaffe")

    {

      TakeDamage(5);

    }

  }

  public void TakeDamage(int Schaden)

  {

    Schaden -= Rüstung.GetValue();

    Schaden = Mathf.Clamp(Schaden, 0, int.MaxValue);

    currenthealthGegner -= Schaden;

    Debug.Log(transform.name + " takes " + Schaden + "Schaden.");

    if (currenthealthGegner <= 0)

    {

      Die();

    }

  }

  public virtual void Die()

  {

    Object.Destroy(this.gameObject);

  }

}

Computer, Programmieren, CSharp, Unity 3D, Unity, Spiele und Gaming
2 Antworten
Deutsche Erklärung was der Fehler ist, weil Englische im Internet versteh ich net :/ [IndexOutOfRangeException]?

Fehlercode:

IndexOutOfRangeException: Index was outside the bounds of the array.

RotSpawner+<waitSpawner>d__10.MoveNext ()

Ich hab nur verstanden, dass das was mit den Maximalwerten oder so zu tun hat. Kann mir jemand das Problem erklären und wie man sowas löst?

Am besten wärs wenn ihr als Beispiel mein Script nehmen könntet

Wenns Script nötig ist:

public class RotSpawner : MonoBehaviour
{
  public GameObject[] enemies;
  public Vector3 spawnValues;
  public float SpawnWait;
  public float spawnMostWait;
  public float spawnLeastWait;
  public int startWait;
  public bool stop;
  int randEnemy;
  // Start is called before the first frame update
  void Start()
  {
    StartCoroutine(waitSpawner());
  }
  // Update is called once per frame
  void Update()
  {
    SpawnWait = Random.Range(spawnLeastWait, spawnMostWait);
  }
  IEnumerator waitSpawner()
  {
    yield return new WaitForSeconds(startWait);
    while (!stop)
    {
      randEnemy = Random.Range(0, 2);
      Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), 1, Random.Range(-spawnValues.z, spawnValues.z)); //Random Position
      Instantiate(enemies[randEnemy], spawnPosition + transform.TransformPoint(0, 0, 0), gameObject.transform.rotation);
      yield return new WaitForSeconds(SpawnWait);
    }
  }
}
Sprache, Programmieren, CSharp, Entwicklung, Script, Logikfehler, Unity
1 Antwort
C# / Unity: Mit Leertaste Spiel starten?

Hallo,

ich habe ein Spiel in Unity programmiert, in dem man mit einem Block verschiedenen Blöcken ausweichen muss. Wenn man diese berührt, fängt alles noch einmal an (ziemlich einfaches Spielprinzip).

Der Spielerblock bewegt sich dauerhaft nach vorne und man hat die Möglichkeit, sich nach rechts oder links zu bewegen.

Nun möchte ich, wenn ich am Anfang des Spiels die Leertaste drücke, dass sich dieser Block ab dann dauerhaft nach vorne bewegt. Nur leider geht der Spieler immer nur ein paar Pixel nach vorne, wenn ich die Leertaste drücke. Aber er soll dauerhaft nach vorne gehen. Ich hoffe, Ihr versteht, was ich meine.

Hier mein Quellcode:

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

public class MoveScript : MonoBehaviour
{
  public float movespeed = 7f;
  public float movespeed2 = 7f;

  // Start is called before the first frame update
  void Start()
  {
  }

  // Update is called once per frame
  void Update()
  {
    float H = Input.GetAxis("Horizontal") * movespeed;
    Vector3 vec = new Vector3(H, 0, 0);
    Vector3 frontvec = new Vector3(0, 0, movespeed2);

Ab hier versuche ich, dies zu programmieren:

if (Input.GetKeyDown(KeyCode.Space))
{
  transform.Translate(frontvec * movespeed2 * Time.deltaTime);
}

if (Input.GetKeyUp(KeyCode.Space))
{
  transform.Translate(frontvec * movespeed2 * Time.deltaTime);
}

Ab hier geht es mit dem Rest weiter:

    transform.Translate(vec * movespeed * Time.deltaTime);
  }
  
  private void OnCollisionEnter(Collision collision)
  {
    if (collision.gameObject.tag == "Starters")
    {
      SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
  }
  
  private void OnTriggerEnter(Collider other)
  {
    if (other.gameObject.tag == "SpeedP")
    {
      movespeed2 += 1f;
    }
  
    if (other.gameObject.tag == "SideSPWN")
    {
      SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
  }
}
CSharp, Unity
1 Antwort

Meistgelesene Fragen zum Thema CSharp