2016-08-06 6 views
0

Ich weiß in Javascript, ich kann einen Funktionsnamen und ein Array von Vars übergeben, und dann diese Funktion mit diesen Vars zu einem beliebigen Zeitpunkt später ausführen .Gibt es eine Möglichkeit, einen beliebigen Funktionsaufruf zu speichern und später auszuführen

Es macht es einfacher, dass alles im Grunde das gleiche var-Ding ist. In C# gibt es auch var, aber es sieht so aus, als ob der Typ abhängig davon definiert wird, was Sie hineinlegen.

Was ich versuche zu erreichen ist zu sagen:

nehmen Sie die Funktion und Parameter: foo (bar1, bar2 ... Scheune)

und führen sie in 5 Sekunden.

Ich verwende Unity, so dass der Timing-Teil einfach ist, aber ich kann nicht herausfinden, wie man eine Funktion übergeben und beliebige mögliche Parameter beliebiger Typen angeben kann.

Pseudocode:

class myTimerClass{ 
    functionHandle myFunction; 
    var params; 
    float startTime, delayTime; 
    bool pending = false; 

    public myTimerClass(functionHandle myFunction, var params, float delay){ 
    this.myFunction = myFunction; 
    this.params = params; 
    this.delay = delay; 
    this.startTime = System.currentTime; 
    pending = true; 
    } 
    public void update(){ 
    if(System.currentTime>=startTime+delay && pending){ 
     pending = false; 
     INVOKE(myFunction,params); 
    } 
    } 

} 
<something calls the update() every frame> 

Ich habe < auf Aktion und func lesen,> und die Delegierten, aber es scheint nicht ein Weg, um eine beliebige Funktion mit beliebigem params zu handhaben.

+0

Mögliche Duplikate von [C# verzögerte Funktionsaufrufe] (http://stackoverflow.com/ques (545533/c-sharp-verzögerte Funktionsaufrufe) –

+0

Verwenden Sie einfach den allgemeinsten Funktionstyp 'Delegate' und dann die' Invoke'-Methode. –

+0

Schauen Sie sich die dritte Antwort an, nicht die akzeptierte. Sie brauchen nicht bar() ', Sie können alles im Lambda tun. IMHO ist es ziemlich ähnlich zu JavaScript, wo setTimeout() auch einen Timer verwendet. –

Antwort

1

Nach mehr suchen, fand ich endlich, was funktioniert:

http://answers.unity3d.com/answers/932529/view.html

ich buchstäblich jeden Code passieren kann, und es wird jederzeit ausführen. Perfekt!

Jetzt habe ich eine eigene Klasse haben (nur um es ordentlich zu halten), die den folgenden Block hat:

public void doThingAfterTime(System.Action action, float time){ 
    StartCoroutine(CoroutineUtils.DelaySeconds(action,time)); 
} 

So kann ich etwas tun, wie

doThingAfterTime (() => doPrint ("s", "d"), 2); 

, die das nennen finden Arbeit Funktion, die als Referenz lautet:

public void doPrint(string s, string s2){ 
    print (s); 
    print (s2); 
}