KaBau Geschrieben 17. März 2018 Melden Share Geschrieben 17. März 2018 Hi, mein Touch Controler unter welchen in am Ende dort beigefügt habe hat im Nachgang doch Probleme: ab und zu verschwindet der Player bei zu schnellen Bewegungen. Und das Raumschiff bewegt sich nie parallel zur Touch Position. Ich denke mir, das liegt daran, dass "Input.GetTouch(0).deltaPosition" den Pixelabstand ermittelt, aber nicht den World Abstand im Spiel. Da die Touch Steuerung für mich neu ist, habe ich nun die gesamten Abende in der Woche versucht einen besseren Controller zu programieren. Ich versuche nun mit "Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position)" die Touchposition in die World Position umzuwandeln und dann weiter zu bearbeiten. Leider ohne Ergebnis. Hier mein aktueller Stand Da das Script nicht funktionierte, habe ich es gelöscht. Die lauffährige Version ist in einem eigenen Treat eingetragen. Ich denke mir, dass ich mit Vector3 und Vector2 Fehler erstelle. Bin mir aber nicht sicher. Derzeit fliegt mein Raumschiff immer nur nach oben, egal wie ich meinen Finger bewege. Früher flog es nur nach oben rechts. Eventuell ist aber auch das Problem, dass mein Game eine 3D Camera hat, welche von oben auf die Spielwelt schaut. Ich versuche aber ein auf einer Y-Ebene 0 liegendes Raumschiff in die X-Richtung (links und rechts), bzw. Z-Richtung (hoch und runter) zu bewegen. Da "ScreenToWorldPoint" aber ein Vector3 ausgibt kann es ja irgendwie auch nicht klappen. Oder muss ich mit "ScreenToViewportPoint" arbeiten? Wobei mir hierbei nicht der Unterschied zu "..WorldPoint" und "...ViewportPoint" klar ist. Da verlässt mich mein Englisch. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
KaBau Geschrieben 28. März 2018 Autor Melden Share Geschrieben 28. März 2018 Wie oben geschrieben, habe ich nun den Controller geändert. Hierzu habe ich einem Cube erstellt, als Target für den Player, damit ich diesen mit private void FixedUpdate() { if (plyTarget != null) { transform.position = Vector3.Lerp(transform.position, plyTargetPos.position, plyMoveSpeed); } } zum Cube bewegen kann. Den Cube selber habe ich folgendes Script angehängt public class PlyTouchTargetMove : MonoBehaviour { Vector3 plyTargetPos; Vector3 touchOldPos; Vector3 touchNewPos; Vector3 diff; float plyXMin = -8.0f; // Spielfeldgrenze links float plyXMax = 8.0f; // Spielfeldgrenze rechts float plyZMin = -4.4f; // Spielfeldgrenze unten float plyZMax = 21f; // Spielfeldgrenze oben float posStartX = 0.5f; // Verhältnis Startposition Player beim Start zur Screenbreite float posStartZ = 0.175f; // Verhältnis Startposition Player beim Start zur Screenhöhe float PlyTargetMoveSpeedHorizontal = 16.0f; // plyXMin bis plyXMax float plyTargetMoveSpeedVertical = 25.5f; // plyzMin bis plyZMax void Update() { // if (Input.GetButtonDown("Fire1")) if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { touchOldPos = Camera.main.ScreenToViewportPoint(Input.GetTouch(0).position); float tOPX = (touchOldPos.x -= posStartX) * PlyTargetMoveSpeedHorizontal; float tOPY = (touchOldPos.y -= posStartZ) * plyTargetMoveSpeedVertical; float tpx = transform.position.x; float tpz = transform.position.z; diff = new Vector3(tpx -= tOPX, 0f, tpz -= tOPY); return; } // if (Input.GetButton("Fire1")) if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) { touchNewPos = Camera.main.ScreenToViewportPoint(Input.GetTouch(0).position); touchNewPos.x = (touchNewPos.x -= posStartX) * PlyTargetMoveSpeedHorizontal; touchNewPos.z = (touchNewPos.y -= posStartZ) * plyTargetMoveSpeedVertical; touchNewPos.y = 0.0f; plyTargetPos = touchNewPos += diff; if (plyTargetPos.x >= plyXMax) { plyTargetPos.x = plyXMax; } if (plyTargetPos.x <= plyXMin) { plyTargetPos.x = plyXMin; } if (plyTargetPos.z >= plyZMax) { plyTargetPos.z = plyZMax; } if (plyTargetPos.z <= plyZMin) { plyTargetPos.z = plyZMin; } transform.position = plyTargetPos; } } } Unter "if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)" ermittle ich den Abstand zwischen der aktuellen Position des Cube und der ersten Toucheingabe, damit ich diese später als Variable "diff" nutzen kann. Somit hängt der Cube nicht direkt an meiner Touchposition. Unter "if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)" lege ich als neue Position des Cube die aktuelle Toucheingabe zugrunde, mit der zuvor genannten "diff" Variable. Zudem prüfe ich, ob der Cube innerhalb der Spielfeldgrenzen (Variablen "plyxMin"...) liegt. Zur Ermittlung der Cube Position in Verbindung zur Toucheingabe: Die Auswertung des Touchposition passiert mit "Camera.main.ScreenToViewportPoint(Input.GetTouch(0).position);", wobei nach meinem Wissen ein Wert zwischen 0,0 und 1,1 (x und y Richtung) ausgegeben wird. Zuerst setzte ich mit "touchOldPos.x -= posStartX" den Toucheingabewert 0.5 in X Richting auf 0 (also der Spielfeldmitte). Danach multipliziere ich mit "... * PlyTargetMoveSpeedHorizontal" diesem Wert mit der maximalen Spielfeldausdehnung. Ergibt beispielhaft für die Toucheingabe 0.25 in X Richtung: 0.25 - 0.5 = -0.25 * 16 = -4 als Spielfeldwert, was bei einem Spielfeld von -8 bis +8 Richtig ist. Da ich die Toucheingabe direkt auf die Position des Cube umsetze habe ich alles in der Update Methode belassen. Was mir Anfangs Kopfzerbrechen bereitete war die Umrechnung der Y Richtung der Toucheingabe in die Z Richtung des Spiel, da ich von oben auf das Spiel schaue und ich somit den Player gar nicht in Y Richtung der Spielwelt bewege. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.