Jump to content
Unity Insider Forum
Sign in to follow this  
SyntaxTalkstoMe

Input Touch Frage

Recommended Posts

Hi,

ich habe jetzt doch mal wieder eine Frage. Und zwar möchte ich gerne, dass wenn man auf der linken Seite des Touchbildschirmes drückt das eine passiert und auf der anderen Hälfte, soll etwas anderes passieren.

Das funktioniert auch so wie ich es mir vorgestellt habe. Allerdings gibt es kleines Steuerungsproblem.

Beim gedrückt halten auf der linken seite des Screens soll der Character steigen. Das heißt man muss den Finger auf dem Display halten. Auf der rechten Seite soll ein einzelner Touchclick abgefragt werden zum schießen eines Feuerballs.

Allerdings vertragen sich irgendwie zwei "gleichzeitige" Befehle auf dem Touchdisplay irgendwie nicht. Die Eingabe auf der rechten Seite des Screens, hebt irgendwie die Eingabe des linken Touches auf. Gibts da irgendein Kniff? Hab zwar gegoogelt, allerdings finde ich nur Einträge, zu Multitouch Sachen, also bestimmte nacheinander folgende Touchbewegungen.

Das Input.MultitouchEnabled ist auf true.

Share this post


Link to post
Share on other sites

Ich rate jetzt einfach mal blind, dass du Input.GetTouch und dergleichen benutzt.

Denke mal, etwas Code hilft da mehr als tausend Worte:

private void Update()
{
  for (var touchIndex = 0; touchIndex < Input.touchCount; touchIndex++)
  {
    var touch = Input.GetTouch(touchIndex);

    // If touch is on left screen half
    if (touch.position.x <= Screen.width / 2)
    {
      MoveCharacterUpwards();
    }
    else
    {
      if (touch.phase == TouchPhase.Began)
      {
        ShootFireball();
      }
    }
  }
}

Wenn das nicht funktionieren sollte, würde ich stark darauf tippen, dass dein Testgerät extrem alt ist und gar kein Multitouch unterstützt.

  • Thanks 1

Share this post


Link to post
Share on other sites

Mein Code sieht folgendermaßen aus:

 

Für die rechte Seite des Bildschirms:

 
Für den FEuerball

// die Mitte des aktuellen Kameraauschnittes
        float mitteDesBildschirms = Camera.main.pixelWidth * 0.5f;

        if (Input.GetTouch(1).position.x > mitteDesBildschirms)
        {
            //Up and Down
            if (GameLogic.gameStartet)
            {
                if (Input.touchCount > 0)
                {
                    Touch touch = Input.touches[0];
                    float count = touch.tapCount;
                    
                    if (touch.phase == TouchPhase.Stationary)
                    {
                        if (canFire)
                        {
                            StartCoroutine(Shoot());                            
                        }
                    }              
                    
                }
                
            }
        }

 

Für die linke Seite des Bildschirms:

 float mitteDesBildschirms = Camera.main.pixelWidth * 0.5f;

        //Ist die Touch Position kleiner als die mitte des Bildschirmes, fliegt der Charakter
        //nach oben. Befindet sich die Position größer als die Mitte des Bildschirms, wird ein Feuerball
        //geschossen.
        if (Input.GetTouch(0).position.x < mitteDesBildschirms)
        {
            //Up and Down
            if (!dead && !gameOver && GameLogic.gameStartet)
            {
                if (Input.touchCount > 0)
                {
                    Touch touch = Input.touches[0];
                    float count = touch.tapCount;

                    if (touch.phase == TouchPhase.Stationary)
                    {
                        rb2d.AddForce(new Vector2(0, 80), ForceMode2D.Force);
                    }
               
                }
            }
    

 

 

Share this post


Link to post
Share on other sites

Da haben wir's ja. Du schaust immer, ob Touch 1 rechts is und Touch 0 links. Da der Index aber neu vergeben wird, je nach dem, welcher Touch zuerst da war, klappt das gerne mal nicht. Hinzu kommt, dass mann mit seinen Patschehändchen durchaus versehentlich mal einen dritten Touch hat oder so.

Gehe deshalb wie bei meinem Code mit einer Schleife durch alle Touches durch, und jeder Touch kann, unabhängig vom Index, alles auslösen.

Share this post


Link to post
Share on other sites

Ja ich muss mir das nochmal genauer angucken.

Das mit den Schleifen bei den Toucheingaben habe ich noch nicht wirklich verstanden warum das so gemacht wird.

Aber ich weiß jetzt wo der Fehler liegt und kann dementsprechend schauen. Danke dir 👍

Share this post


Link to post
Share on other sites

Die Schleife ist eben dafür da, durch alle Touches durchzugehen und sie alle gleich zu behandeln, da der Index eines Touches so gut wie nie Einfluss auf die Interpretation des Touches haben sollte.

Share this post


Link to post
Share on other sites

Ah. Ok. Verstanden.

Also mit anderen Worten gesagt, werden die Touches erstmal in Form vom Count gespeichert und dann sauber per Schleife abgearbeitet.

Ich denke ich hab es verstanden.

Meine oben genannten Codeschnipsel sind aus zwei verschiedenen Skripten. Wäre es sinnvoller, diese dann zusammenzuführen und über einen Count, bzw die gleichen Variablen laufen zu lassen? 

Share this post


Link to post
Share on other sites
vor 4 Stunden schrieb SyntaxTalkstoMe:

werden die Touches erstmal in Form vom Count gespeichert

Uff... naja, nicht so wirklich. Da wird einfach hochgezählt und dann wird GetTouch mit der hochgezählten Zahl aufgerufen.

vor 4 Stunden schrieb SyntaxTalkstoMe:

Meine oben genannten Codeschnipsel sind aus zwei verschiedenen Skripten. Wäre es sinnvoller, diese dann zusammenzuführen und über einen Count, bzw die gleichen Variablen laufen zu lassen? 

Kommt immer darauf an. Modulare Herangehensweisen sind immer erstmal gut - ist zum Beispiel eine schöne Sache, wenn dein "Linke Seite"-Script drinbleiben kann, wenn du das "Rechte Seite"-Script deaktivierst. Zweimal oder sogar öfter eine Schleife zu haben, die GetTouch aufruft, ist auch kein Problem. Eine Aufteilung wird immer weniger sinnvoll, je mehr sie bedeutet, denselben Code doppelt zu haben. Da das hier nicht wirklich der Fall ist, kann man das schon getrennt lassen.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×