Jump to content
Unity Insider Forum

Input.GetTouch


Recommended Posts

Grüße!

Bin gerade dabei mir eine Gestensteuerung zusammen zu basteln. Mit viel Googeln und probieren hab ich mir was zusammen gemurxt, zufrieden bin ich keineswegs.

An sich sollen es nur zwei gesten sein.

1. Ein-Finger-System Rotation

2. Zwei-Finger-System Zoom

Wenn ich es über Unity Remote 5 teste, funktioniert alles problemlos. Packe ich es jedoch in APK, fangen die Probleme an.

Problem 1: Die Rotation ist extrem langsam gegenüber dem was er mir mit Remote 5 anzeigt.

Problem 2: Zoom-In funktioniert zwar mit rucklern, jedoch Zoom-Out macht noch größere Probleme, er ruckelt extrem, schaltet immer wieder in Zoom-In zurück und nimmt die Geste kaum an. Auch hier das selbe, unter Unity Remote 5 funktioniert es, als APK eben nicht.

Ich hoffe, ihr könnt mir mal wieder aus der Klemme helfen! :)

public class KamerasteuerungI : MonoBehaviour {

    public Camera kamera;
    public GameObject kameraLinksRechts;
    public GameObject kameraObenUnten;

    private Vector2 touchDeltaPosition = new Vector2(0, 0);
    private Vector2 ersteDistanz = new Vector2(0, 0);
    private Vector2 zweiteDistanz = new Vector2(0, 0);

    public int kameraGeschwindigkeit = 2;

    public float minScale = 2.0f;
    public float maxScale = 5.0f;
    public float minPinchGeschwindigkeit = 2.0f;
    public float varianceInDistanz = 5.0f;
    private float touchDelta = 0.0f;

    private float geschwindigkeitTouch0 = 0.0f;
    private float geschwindigkeitTouch1 = 0.0f;

    void Update() {
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved) {
            touchDeltaPosition = Input.GetTouch(0).deltaPosition;
            kameraObenUnten.transform.Rotate(-touchDeltaPosition.y * Time.deltaTime * kameraGeschwindigkeit, 0, 0);
            kameraLinksRechts.transform.Rotate(0, -touchDeltaPosition.x * Time.deltaTime * kameraGeschwindigkeit, 0);
        }

        if (Input.touchCount == 2 && Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved) {
            ersteDistanz = Input.GetTouch(0).position - Input.GetTouch(1).position; // Aktueller Abstand zwischen den Finger Berührungen
            zweiteDistanz = ((Input.GetTouch(0).position - Input.GetTouch(0).deltaPosition) - (Input.GetTouch(1).position - Input.GetTouch(1).deltaPosition)); // Unterschied zu den früheren Berührungen mit Delta-Positionen
            touchDelta = ersteDistanz.magnitude - zweiteDistanz.magnitude;
            Debug.Log(geschwindigkeitTouch0 + " " + geschwindigkeitTouch1);
            geschwindigkeitTouch0 = Input.GetTouch(0).deltaPosition.magnitude / Input.GetTouch(0).deltaTime;
            geschwindigkeitTouch1 = Input.GetTouch(1).deltaPosition.magnitude / Input.GetTouch(1).deltaTime;

            if ((touchDelta + varianceInDistanz < 0) && (geschwindigkeitTouch0 > minPinchGeschwindigkeit) && (geschwindigkeitTouch1 > minPinchGeschwindigkeit)) {
                kamera.fieldOfView = Mathf.Clamp(kamera.fieldOfView + (1 * kameraGeschwindigkeit), 15, 90);
            }

            if ((touchDelta + varianceInDistanz > 0) && (geschwindigkeitTouch0 > minPinchGeschwindigkeit) && (geschwindigkeitTouch1 > minPinchGeschwindigkeit)) {
                kamera.fieldOfView = Mathf.Clamp(kamera.fieldOfView - (1 * kameraGeschwindigkeit), 15, 90);
            }
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mittlerweile bin ich soweit:

public class KamerasteuerungI : MonoBehaviour {

    public Camera kamera;
    public GameObject kameraLinksRechts;
    public GameObject kameraObenUnten;

    private Vector2 touchDeltaPosition = new Vector2(0, 0);
    private Vector2 ersteDistanz = new Vector2(0, 0);
    private Vector2 zweiteDistanz = new Vector2(0, 0);

    public int kameraDrehGeschwindigkeit = 6;
    public int kameraZoomGeschwindigkeit = 8;

    public float minScale = 2.0f;
    public float maxScale = 5.0f;
    public float minPinchGeschwindigkeit = 2.0f;
    public float varianceInDistanz = 5.0f;
    private float touchDelta = 0.0f;
    private float geschwindigkeitTouch0 = 0.0f;
    private float geschwindigkeitTouch1 = 0.0f;

    void Update() {
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved) {
            touchDeltaPosition = Input.GetTouch(0).deltaPosition;
            kameraObenUnten.transform.Rotate(-touchDeltaPosition.y * kameraDrehGeschwindigkeit, 0, 0);
            kameraLinksRechts.transform.Rotate(0, -touchDeltaPosition.x * kameraDrehGeschwindigkeit, 0);
        } else if (Input.touchCount == 2 && Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved) {
            ersteDistanz = Input.GetTouch(0).position - Input.GetTouch(1).position; // Aktueller Abstand zwischen den Finger Berührungen
            zweiteDistanz = ((Input.GetTouch(0).position - Input.GetTouch(0).deltaPosition) - (Input.GetTouch(1).position - Input.GetTouch(1).deltaPosition)); // Unterschied zu den früheren Berührungen mit Delta-Positionen
            touchDelta = ersteDistanz.magnitude - zweiteDistanz.magnitude;
            geschwindigkeitTouch0 = Input.GetTouch(0).deltaPosition.magnitude / Input.GetTouch(0).deltaTime;
            geschwindigkeitTouch1 = Input.GetTouch(1).deltaPosition.magnitude / Input.GetTouch(1).deltaTime;
            Debug.Log(kamera.orthographicSize);
            
            if ((touchDelta + varianceInDistanz < 0) && (geschwindigkeitTouch0 > minPinchGeschwindigkeit) && (geschwindigkeitTouch1 > minPinchGeschwindigkeit)) {
                // Zoom OUT
                kamera.orthographicSize = Mathf.Clamp(kamera.orthographicSize + (Time.deltaTime * kameraZoomGeschwindigkeit), 0.1f, 179.9f);
                
            } else if ((touchDelta + varianceInDistanz > 0) && (geschwindigkeitTouch0 > minPinchGeschwindigkeit) && (geschwindigkeitTouch1 > minPinchGeschwindigkeit)) {
                // Zoom IN
                kamera.orthographicSize = Mathf.Clamp(kamera.orthographicSize - (Time.deltaTime * kameraZoomGeschwindigkeit), 0.1f, 179.9f);
            }
        } 
    }
}

Drehen an sich funktioniert nun ganz gut, ohne stocken, muss ihm nur noch beibringen, dass er nur bis zu einem bestimmten Punkt drehen kann.

Problem ist jedoch immer der Zoom, der springt hin und her wie er will. Er kommt immer wieder durch einander, ob Zoom-In oder Zoom-Out gerade ausgeführt wird. :huh:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schön, wenn man Lösungen findet, die man selbst nicht versteht.

Falls sich das wer erklären kann, bitte melden! :)

Hab jetzt je den Zoom-In und Zoom-Out in eine While-Schleife gepackt und frage touchDelta ab. Was ich nicht verstehe, wenn er in der Schleife "gefangen" ist, woher bekommt er die veränderten touchDelta Werte?

--------

EDIT: Zu früh gefreut, klappt doch net so ganz! -,-"

public class KamerasteuerungI : MonoBehaviour {

    public Camera kamera;
    public GameObject kameraLinksRechts;
    public GameObject kameraObenUnten;

    private Vector2 touchDeltaPosition = new Vector2(0, 0);
    private Vector2 ersteDistanz = new Vector2(0, 0);
    private Vector2 zweiteDistanz = new Vector2(0, 0);

    public float kameraDrehGeschwindigkeit = 15.0f;
    public float kameraZoomGeschwindigkeit = 25.0f;

    public float minScale = 2.0f;
    public float maxScale = 5.0f;
    public float minPinchGeschwindigkeit = 2.0f;
    public float varianceInDistanz = 5.0f;
    private float touchDelta = 0.0f;
    private float geschwindigkeitTouch0 = 0.0f;
    private float geschwindigkeitTouch1 = 0.0f;

    void Update() {
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved) {
            touchDeltaPosition = Input.GetTouch(0).deltaPosition;
            kameraObenUnten.transform.Rotate(-touchDeltaPosition.y * kameraDrehGeschwindigkeit * Time.deltaTime, 0, 0);
            kameraLinksRechts.transform.Rotate(0, -touchDeltaPosition.x * kameraDrehGeschwindigkeit * Time.deltaTime, 0);
        } else if (Input.touchCount == 2 && Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved) {
            ersteDistanz = Input.GetTouch(0).position - Input.GetTouch(1).position; // Aktueller Abstand zwischen den Finger Berührungen
            zweiteDistanz = ((Input.GetTouch(0).position - Input.GetTouch(0).deltaPosition) - (Input.GetTouch(1).position - Input.GetTouch(1).deltaPosition)); // Unterschied zu den früheren Berührungen mit Delta-Positionen
            touchDelta = ersteDistanz.magnitude - zweiteDistanz.magnitude;
            geschwindigkeitTouch0 = Input.GetTouch(0).deltaPosition.magnitude / Input.GetTouch(0).deltaTime;
            geschwindigkeitTouch1 = Input.GetTouch(1).deltaPosition.magnitude / Input.GetTouch(1).deltaTime;
            

            if ((touchDelta + varianceInDistanz < 0) && (geschwindigkeitTouch0 > minPinchGeschwindigkeit) && (geschwindigkeitTouch1 > minPinchGeschwindigkeit)) {
                // Zoom OUT
                while (true) {
                    if (touchDelta < 0 ) {
                        Debug.Log(touchDelta);
                        kamera.orthographicSize = Mathf.Clamp(kamera.orthographicSize + (Time.deltaTime * kameraZoomGeschwindigkeit), 3f, 45f);
                    } break;
                }

            } else if ((touchDelta + varianceInDistanz > 0) && (geschwindigkeitTouch0 > minPinchGeschwindigkeit) && (geschwindigkeitTouch1 > minPinchGeschwindigkeit)) {
                // Zoom IN
                while (true) {
                    if (touchDelta > 0) {
                        Debug.Log(touchDelta);
                        kamera.orthographicSize = Mathf.Clamp(kamera.orthographicSize - (Time.deltaTime * kameraZoomGeschwindigkeit), 3f, 45f);
                    } break;
                } 
            }
        } 
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...