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

Build Fehler und Input komisch

Recommended Posts

Hallo,

 

Ich habe angefangen mit Unity ein Pong für Android zu entwickeln. Das hat auch gut funktioniert, bis es zur Eingabe mit dem Touch Input kam.

 

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

public class Player1Script : MonoBehaviour {

    public int speed = 800;
	
	void Start () 
    {
		
	}


    void FixedUpdate() 
    {
        int touchCount = Input.touchCount;

        for (int i = 0; i < touchCount; i++)
        {
            Touch touch = Input.GetTouch(i);
            if (touch.phase == TouchPhase.Began)
            {
                if (touch.position.y > Screen.height / 2.0f)
                {
                    GetComponent<Rigidbody2D>().velocity = new Vector2(0, 1.5f) * speed * Time.deltaTime;
                }
                else if (touch.position.y < Screen.height / 2.0f)
                {
                    GetComponent<Rigidbody2D>().velocity = new Vector2(0, -1.5f) * speed * Time.deltaTime;
                }
            }
            else if (touch.phase == TouchPhase.Ended)
            {
                GetComponent<Rigidbody2D>().velocity = new Vector2(0, 0);
            }
        }
	}
}

Dieses Script ist dafür zuständig den Spieler 1 zu bewegen und wurde dem GameObject auch zugewiesen. Spieler 2 wird dabei von einer "KI" bewegt. 

 

Nun ist mein Problem aber, das die Steuerung sehr sehr ungenau ist. Ich meine damit mal bewegt es sich gar nicht und mal schon, mal läuft es direkt bis unten durch und mal funktioniert es so wie es auch sein soll. Ich habe es auch schon mit Update statt FixedUpdate versucht leider ohne Erfolg. Die Steuerung bleibt so. Getestet wurde es auf einem Samsung S7 und einem Samsung Tab A von 2016 weswegen ich jetzt nicht denke es hat etwas mit der Hardware zu tun.

 

 

2. Mein zweites Problem ist, als ich das Projekt als Gradle bauen wollte um eventuell den Fehler oben zu beheben (war ein versuch) kann ich es nicht bauen. Er sagt mir immer das irgendwelche Abhängigkeiten fehlen usw. Als normales Projekt geht es aber, weswegen ich nicht davon ausgehe, das es an den Abhängigkeiten liegt. Ich habe etwas recherchiert und habe herausgefunden, das es ein Bug von AdMob sein kann, was ich auch zu Testzwecken drin habe. Wurde das Problem schon gelöst und wenn ja wie kann ich es auch lösen? 

 

 

 

Mit freundlichen Grüßen

 

Dominik Robert

Share this post


Link to post
Share on other sites

Zum ersten Problem:
- den Spielerinput in der Update-Methode auswerten
Du kannst die Velocity hier berechen aber nicht übergeben!
- den Rigidbody2D in der FixedUpdate-Methode manipulieren
Hier dann die im Updatezyklus berechnete Velocity übergeben.
 

void Update() 
{
        int touchCount = Input.touchCount;

        for (int i = 0; i < touchCount; i++)
        {
            Touch touch = Input.GetTouch(i);
            if (touch.phase == TouchPhase.Began)
            {
                if (touch.position.y > Screen.height / 2.0f)
                {
                    vel = new Vector2(0, 1.5f) * speed * Time.deltaTime;
                }
                else if (touch.position.y < Screen.height / 2.0f)
                {
                    vel = new Vector2(0, -1.5f) * speed * Time.deltaTime;
                }
            }
            else if (touch.phase == TouchPhase.Ended)
            {
                vel = new Vector2(0, 0);
            }
        }
}

void FixedUpdate() 
{
  rb2d.velocity = vel;
}


Und bitte  GetComponent() nur 1x aufrufen:

private Vector3 vel;
private Rigidbody2D rb2d;

void Start() 
{
  Rigidbody2D rb2d = GetComponent<Rigidbody2D>();
}


Ansonsten kann ich nicht mit Sicherheit sagen, ob du da die Touchphase richtig verwendest, hier ein paar Beispiele:
https://docs.unity3d.com/ScriptReference/Input.GetTouch.html

  • Thanks 1

Share this post


Link to post
Share on other sites

Sind aber noch ein paar Schnitzer drin.

  1. So, wie es im Moment im Code von @Zer0Cool ist, kannst du eigentlich direkt alles in Update machen. Den velocity-Wert eines Rigidbody(2D)s kann man jederzeit ändern, und in dieser Situation schadet es nicht einmal. Den Code so zu bauen, wie es vorher war, aber in Update statt in FixedUpdate, funktioniert genauso.
  2. Rigidbody(2D).velocity ist eine Geschwindigkeit. Wenn du einen konstanten Vector2(1,0) als Geschwindigkeit setzt, bedeutet das 1m/s nach rechts. Das passiert hier aber nicht - es wird ein Vector2 multipliziert mit Time.deltaTime als Geschwindigkeit gesetzt. Der Vektor ist dann schon in sich x m/s in eine Richtung und daraus wird dann als Rigidbody2D.velocity x m/s², also eine Beschleunigung. Das ergibt nicht so sonderlich viel Sinn. Und entsprechend bewirkt es auch, dass dein GamePlay bei unterschiedlichen FPS unterschiedlich ausfällt. Oder anders: Dein Objekt ist bei höheren FPS langsamer unterwegs.
    Lange Rede, kurzer Sinn: Nimm die Time.deltaTime da raus.

Share this post


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...
Sign in to follow this  

×
×
  • Create New...