2016-04-04 12 views
1

Ich habe ein separates Skript der Zeit, die ich verwende, um Zeit in meiner Szene zu zeigen. Es enthält Stunden und Minuten und Sekunden Variable. Ich möchte einige bestimmte Arbeit, zum Beispiel, Code-Ausführung zu bestimmten Zeit und derzeit mache ich etwas wie dies tun. im Update. Ich führe eine Funktion aus, die kontinuierlich die Zeitvariable überprüft, um eine Animation auszuführen.Vermeiden Sie "Update" zu verwenden?

void Update() 
    { 
     checkTrainArriveTime(); 
     } 
     void checkTrainArriveTime() 
    { 
     if (timeManager.GetComponent<Scale2>().hour == trainArriveTimeHour && timeManager.GetComponent<Scale2>().min == trainArriveTimeMin 
      && isTrainArriveConditionExecute) 
     { 

      isTrainArriveConditionExecute = false; 
      PlayAnimationClip("Start"); 
     } 
     else if (timeManager.GetComponent<Scale2>().min != trainArriveTimeMin) 
     { 
      isTrainArriveConditionExecute = true; 
     } 
    } 

Wenn die Zeit übereinstimmt, spielt diese Funktion die Animation ab. Jetzt habe ich 50 Skripte an 50 verschiedene Spielobjekte angehängt. Es ist funktioniert gut, aber es ist definitiv nicht der richtige Weg, Update Event zu verwenden. In meinem Code ist es notwendig, die Zeit für jeden Frame zu überprüfen und zusätzliche Last auf Update. Gibt es einen effizienten Weg, um diesen Job zu machen?

+1

Wenn es notwendig ist, die Zeit jedes Frames zu überprüfen, dann müssen Sie Update verwenden. Für eine bessere Leistung würde ich empfehlen, GetComponent <>() nicht im eigentlichen Update zu verwenden. Verwenden Sie es einmal bei Start(), um einen Verweis auf Scale2 zu erhalten, und verwenden Sie diesen Verweis. –

+0

Es ist sehr wahrscheinlich, dass Sie UnityEvent von Unity verwenden müssen, was sehr einfach ist und eines der besten Dinge in Unity ist: http://StackOverflow.com/a/36249404/294884 – Fattie

+0

@JoeBlow Danke für Ihren Rat, aber ich habe die Das gleiche Problem der Pause. Zusätzlich kann die Zeitgebergeschwindigkeit durch den Benutzer, der die GUI verwendet, beschleunigt werden. also ruf auch nicht für mich an. –

Antwort

0

Ich kann Ihren Kampf sehen. Sie haben Recht, es ist definitiv nicht der beste Weg nach vorne.

Die beste Option, die ich hier sehen kann, würde Animation Manager erstellen, die eine singleton Instanz ist (es gibt nur eine Instanz pro Anwendung erlaubt).

Ich würde vorschlagen, Ihre Animationsauslöselogik auf eine Update Methode von AnimationManager zu verschieben.

Sobald Sie das getan haben. Sie können auf die Instanz zugreifen, die die Methode AnimationManager.getInstance() aufruft.

Im nächsten Schritt erstellen Sie eine interne Registrierung, die nichts anderes als eine Liste Ihrer registrierten Spielobjekte ist, für die Sie eine Animation auslösen möchten.

Ich weiß nicht, was genau Sie ist timeManager aber ich kann mir vorstellen, es ist wahrscheinlich eine Instanz von TimeManager Controller, den Sie per Drag & Drop auf Ihre öffentlichen timeManager Eigenschaft. Ziehen Sie in Erwägung, es auch in Singleton umzuwandeln oder zumindest die Zuweisung von timeManager.GetComponent<Scale2>() in Awake() Methode.

Es ist wichtig zu nicht vonGetComponent() Methode aufzurufen innerhalb von Update()', as it has an impact on performance. GetComponent` ist recht teuer zu rufen.

Ich hoffe, es hilft.

+1

Sie verwenden einfach UnityEvent hier, es ist seit über 5 Jahren verfügbar. Es ist extrem einfach, könnte nicht einfacher sein: http://stackoverflow.com/a/36249404/294884 – Fattie

Verwandte Themen