2016-05-05 11 views
0

Ich habe folgenden Code geschrieben:Time.deltaTime nicht wie gewünscht arbeitet

using UnityEngine; 
using System.Collections; 

public class ObstacleSpawn : MonoBehaviour { 

    public PlayerScript pScript; 
    public ObstacleScript oScript; 

    public GameObject player; 
    public GameObject obstacle; 

    public float randomSpawnMin; 
    public float randomSpawnMax; 

    // Use this for initialization 
    void Start() { 
     InvokeRepeating ("Spawn", 2F, Random.Range (randomSpawnMin, randomSpawnMax)); 
    } 

    // Update is called once per frame 
    void Update() { 

    } 

    void Spawn() { 
     if (pScript.isRight == true && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (-1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (0.05F, (4F + pScript.playerDimensionY + oScript.obstacleDimensionY) * Time.deltaTime, 0), Quaternion.identity); 
     } else if (pScript.isRight == false && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (-0.05F, (4F + pScript.playerDimensionY + oScript.obstacleDimensionY) * Time.deltaTime, 0), Quaternion.identity); 
     } 
    } 
} 

In meinen Leeren Spawn() Ich laichen ein Element namens Hindernisses, das in Sekunden, um eine gewünschte Menge weg von meinem Player instanziiert werden soll . (Usw. es sollte 2 Sekunden weg sein, bevor der Spieler getroffen wird, oder 1 Sekunden und so weiter. Was Sie in meiner Leere sehen können, ist ich Instantiieren des Hindernisses an der Position des Spielers + ein Betrag, den ich gemessen habe, dann multipliziert mit der Zeit. DELTA. Doch meine Entfernung ändert sie nicht, ob ich meinen Wert ändern mit Time.deltaTime multipliziert oder nicht. Der Abstand zwischen meinen Objekten sind immer 0,02 Sekunden.

Wie kann ich dieses Problem umgehen mein Zeitintervall anpassen?

EDIT - Um eine Klarstellung zu machen, ist dies 2D, und ich werde auch dieses Beispiel zeigen, um etwas Verständnis zu schaffen .. Ich habe versucht, die Multiplikation von Time.deltaTime zu entfernen, da die Programmbewegung sowieso in deltaTime läuft:

void Spawn() { 
     if (pScript.isRight == true && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (-1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (0.05F, (4F + pScript.playerDimensionY + oScript.obstacleDimensionY), 0), Quaternion.identity); 
     } else if (pScript.isRight == false && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (-0.05F, (4F + pScript.playerDimensionY + oScript.obstacleDimensionY), 0), Quaternion.identity); 
     } 
    } 

Angezeigter Code gibt mir ein Intervall von 0,58 Sekunden, das ist mindestens ein Intervall. Mit dieser Logik glaubte ich dieser Code ein 1,16-Intervall bereitstellen sollte (zweimal das Intervall):

void Spawn() { 
     if (pScript.isRight == true && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (-1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (0.05F, (8F + pScript.playerDimensionY + oScript.obstacleDimensionY), 0), Quaternion.identity); 
     } else if (pScript.isRight == false && pScript.inAir == false) { 
      obstacle.transform.localScale = new Vector3 (1, 1, 1); 
      Instantiate (obstacle, player.transform.position + new Vector3 (-0.05F, (8F + pScript.playerDimensionY + oScript.obstacleDimensionY), 0), Quaternion.identity); 
     } 
    } 

Dies jedoch gibt das Ergebnis von 0,92 Intervall, nicht 1,16 - das ist, wo ich wirklich verwirrt.

EDIT FÜR RAHMEN:

enter image description here

Das rote Hindernis bewegt sich immer nach unten den Spieler zu schlagen, aber ich brauche es zu einer einstellbaren Zeit zum Laichen entfernt (1 Sekunden entfernt, 0,5 Sekunden entfernt etc.) .

+0

Time.deltaTime kann nur in Update() verwendet werden. Ihr Code ist völlig bedeutungslos und wird nicht funktionieren. – Fattie

Antwort

6

Die Verwendung von Time.deltaTime ist nur in den Update-Methoden sinnvoll. Stellen Sie sicher, dass Sie Ihre Spawn() -Methode von Update() oder LateUpdate() aufrufen. Um genauer zu sein, speichert DeltaTime-Eigenschaft die genaue Zeit seit dem letzten Update-Aufruf. Wie auch immer, ich bin nicht sicher, warum Sie diese Entfernung abhängig von der Framerate machen möchten. Wenn Sie die Geschwindigkeit Ihres Spielers kennen, sollten Sie seine Bewegung zeitabhängig machen, nicht aber die Entfernungsberechnung. Um Objekte mit einem inverval zu erzeugen, empfehle ich die Verwendung einer Coroutine. So etwas Ähnliches:

private IEnumerator CoSpawn() 
    { 
     while (true)//you can put here any stop condition, otherwise this coroutine will run while gameObject exists and its not stopped by StopCoroutine() 
     { 
      //actual Spawn() call that will instantiate a new obstacle 

      yield return new WaitForSeconds(Random.Range(0, randomSpawnMax) + 2f); //pause for [2-(2+randomSpawnMax)] interval 
     } 
    } 

Sie können diese Koroutine mit StartCoroutine start() in Start() -Methode statt InvokeRepeating().

Update: Ok, wenn Sie die richtige Entfernung des Hindernisses berechnen wollen, dann nehme ich an, dass die Geschwindigkeit konstant ist. Wenn ja, können Sie Hindernis für die Spieler auf diese Weise bewegen:

private void _Update() 
    { 
     var characterPosition = //cant say what it should be in your case 
     MoveTo(characterPosition); 
    } 

    private void MoveTo(Vector3 target) 
    { 
     //use 'transform' if you`re moving the obstacle from the script that is attached to it 
     //if your moving it from some scene controller or anywhere else, call [Obstacle].transform 
     transform.position = Vector3.MoveTowards(transform.position, target, Speed * Time.deltaTime); 
    } 

In diesem Code Geschwindigkeitswert sollte bei beiden Methoden zur Verfügung stehen - derjenige, der das Hindernis und die, die es instanziiert bewegt. Sie können die Geschwindigkeit konstant machen oder sie zum Beispiel in ein globales Konfigurations-Skript einfügen. Und in Spawn() -Methode können Sie korrekten Abstand berechnen:

{ 
    var timeToFall = 2f;//amount of time that the obstacle will fall 
    var position = new Vector3(0, timeToFall * Speed, 0); 
} 
+0

Ist das wichtig, da ich ein InvokeRepeating verwende? – WONDERGG

+0

Soweit ich mich erinnere, werden Invoke und InvokeRepeating-Methoden vom Hintergrund-Thread verarbeitet und Time.deltaTime (wie viele andere Engine-Methoden und -Eigenschaften) kann nur im Haupt-Thread verwendet werden. –

+0

Ich sehe. Ich habe deine aktualisierte Antwort gelesen. Könnten Sie mit einem Vorschlag kommen, der diese Zeit abhängig macht? Ich habe versucht, damit herumzuspielen, aber ohne Ergebnisse. – WONDERGG

0

Time.deltaTime speichert Zeitdifferenzen zwischen den Bildern.Die Verwendung von Time.deltaTime macht nur dann Sinn, wenn Sie sie bei der Update-Methode verwenden, die jeden Frame aufgerufen wird.

In Ihrem Fall können Sie die Zeit berechnen, die zwischen jedem Spawn() Anruf verstrichen ist. Speicher der aktuellen Time.time in einer Eigenschaft, und berechnet die Differenz zwischen dem letzten Spawn Ausführung:

float lastUpdate = 0;  

void Spawn() { 
    float myDelta = Time.time - lastTime; 
    lastUpdate = Time.time 

Dann Verwendung von Time.deltaTime mit myDelta variable ersetzen:

float lastUpdate = 0;  

void Spawn() { 
    float myDelta = Time.time - lastTime; 
    lastUpdate = Time.time 

    if (pScript.isRight == true && pScript.inAir == false) { 
     obstacle.transform.localScale = new Vector3 (-1, 1, 1); 
     Instantiate (obstacle, player.transform.position + new Vector3 (0.05F, (4F + pScript.playerDimensionY + oScript.obstacleDimensionY) * myDelta, 0), Quaternion.identity); 
    } else if (pScript.isRight == false && pScript.inAir == false) { 
     obstacle.transform.localScale = new Vector3 (1, 1, 1); 
     Instantiate (obstacle, player.transform.position + new Vector3 (-0.05F, (4F + pScript.playerDimensionY + oScript.obstacleDimensionY) * myDelta, 0), Quaternion.identity); 
    } 
} 
Verwandte Themen