Jump to content
Unity Insider Forum

Player Controller für Space Ship, Touch Steuerung (gelöst)


KaBau

Recommended Posts

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...