Frage von zantes, 38

Unity 3D Position speichern die sich nicht mehr verändert wenn gespeichert?

Hallo Leute, ich wollte in Unity 3D eine Funktion machen die dem Spieler, wenn er die Linke Maustaste drückt, sich 5 Sekunden lang bewegen kann und nach den 5 Sekunden wieder zurück teleportiert wird an die Position (x,y,z) an der er die funktion gestartet hat , sprich (links click)

Meine Frage ist, wie speicher ich Variablen ab ohne dass sie sich immer an die Position des spielers anpasst, ich will wenn er Links Klickt, die Position kurz gespeichert wird an der er geklickt hat und diese soll sich nicht mehr verändern !

Mein scirpt ist folgendes:

public bool realize = false;
public float timer;

void Update () {

    float PosX = this.transform.position.x;
    float PosY = this.transform.position.y;
    float PosZ = this.transform.position.z;

    // Left Mouse Button = Activate Realize
    if (Input.GetMouseButtonDown (1))
    {
        Debug.Log("Realize Aktiviert!");
        realize = true;
    }

    // Realize Acitvated
    if (realize)
    {
        timer += Time.deltaTime;
        float seconds = timer % 60;
        Debug.Log(seconds);

        float oldPosX = PosX;
        float oldPosY = PosY;
        float oldPosZ = PosZ;

        if(seconds >= 5)
        {
            this.transform.position = new Vector3(oldPosX, oldPosY, oldPosZ);
            realize = false;
            seconds = 0f;
            Debug.Log("New Position is: X-" + oldPosX + " Y-" + oldPosY + " Z-" + oldPosZ);
        }
    }
}
Antwort
von J0T4T4, 20

Zuerst: Es gibt einen besseren Weg, die Koordinaten zu speichern. Nimm einen Vector3, und weise ihm this.transform.position zu. Genau so kannst Du es auch mit oldPos machen.

float seconds = timer % 60;

Was erhoffst Du Dir von dieser Zeile? Ich bin mir ziemlich sicher, dass dadurch seconds schon nach dem ersten Durchgang größer als 5 wird. Generell kannst Du Dir die Variable seconds klemmen. Da Du die deltaTime wahrscheinlich in Millisekunden bekommst, musst Du dann folgendes machen:

if (timer/1000 > 5.0)

Zudem hast Du in deiner jetzigen Variante zwar seconds auf 0 gesetzt, den timer aber lässt Du unverändert. Das sorgt dafür, dass dann auch sofort wieder die Bedingung seconds >= 5 wahr wird, da Du ja seconds = timer % 60 hast.

Was das Speichern der Position angeht: Du brauchst ein Attribut (Variable in Klasse, wie timer oder realize) vom Typ Vector3 (ich nenne ihn mal pos). In die Abfrage nach dem Klicken der linken Maus schreibst Du dann:

pos = this.transform.position;

Damit wird Deine Position nur ein Mal gespeichert. Wenn Du jetzt wieder dahin zurück möchtest musst Du folgendes machen:

this.transform.position = pos;

Da momentan aber die linke Maus mehrfach gedrückt werden könnte, und so weiter pos verändert, musst Du noch folgendes machen:

if (Input.GetMouseButtonDown (1) && !realize)

Ich hoffe mal, ich kann Dir damit weiterhelfen. Getestet habe ich es nicht, weshalb Du vielleicht noch ein wenig probieren musst, aber ich bin mir ziemlich sicher, dass es so gehen sollte.

Kommentar von zantes ,

Klappt ! Danke dir vielmals :)!

Keine passende Antwort gefunden?

Fragen Sie die Community