Sheduler bequeme Routine zum Aufrufen von Funktionen, mein Konditionierungssystem

Das Tool wurde ursprünglich geschrieben, um Ihnen bei der Entwicklung einfacher Casual Games in Unity zu helfen. Zumindest dort war es sehr nützlich.



Aber ich denke, ich werde es in anderen Projekten verwenden, und nicht nur in der Einheit.



Und vielleicht ist es auch für Sie nützlich!



Quelllink






Also, wofür ist er?



Stellen Sie sich eine Situation vor: Sie haben ein einfaches Gelegenheitsspiel geschrieben, in dem Sie zehnmal auf den Bildschirm tippen müssen, um ein Level zu beenden, und es zur Vorschau an Ihren Chef (oder einen verwöhnten Kunden) gesendet.



Gefolgt von Aufgaben nacheinander:



  1. Fügen wir alle 1,5 Minuten Anzeigen im Ziel hinzu.
  2. Und lassen Sie es uns irgendwo am Anfang ein Fenster geben: "Kaufen Sie eine Prämie, damit es keine Werbung gibt"?
  3. Etwas, das dieses Fenster scharf drückt, aber es nach der Werbung sein lässt, aber nur, wenn der Spieler Start drückt und zwei Level passiert?
  4. Und komm schon auf 10, 20, 30 Levels wird es ein "Teilen mit Freunden" -Fenster geben?
  5. Und ab Level 10 alle 2 Level gibt es ein Fenster "Bewerten Sie uns!"?
  6. Und noch ein paar mehr!


Selbst nach einer grausamen Hinrichtung und endlosen Blockierung Ihres Kindes, nachdem Sie die hundertste Position der Fenster überprüft haben, werden Sie früher oder später auf ein solches Problem stoßen: Fenster, die an den Timer gebunden sind, können die Fenster überlappen, die an die Ebenen selbst gebunden sind!



Es wird immer schwieriger, dies zu wiederholen - schließlich sind bedingte Überprüfungen bereits bis zum Hals, und Ihr Kollege könnte seine eigenen Fenster mit völlig unlesbarem Code hinzufügen! Was ist zu tun?






Aufgabe



Rufen Sie das Fenster zu einem bestimmten Zeitpunkt auf (z. B. per Knopfdruck) und nur dann, wenn alle angegebenen Bedingungen erfüllt sind (die Zeit ist abgelaufen, der gewünschte Punkt wurde erreicht usw.).






Entscheidung



Zu diesem Zweck habe ich eine Bedingungsklasse erstellt. Hier sind die Hauptfelder:



  1. timer int setedSeconds
  2. überspringt int setedSkips
  3. List &ltint&gt checkPoints


, , . .



, , . , , , NextSkip(). = 0, ,

. - , START() — .

, StartTimer() ResetSkips(). , IsReady()

true , (value > 0), START() .



: — ( ) setedSeconds, , , !



IsReady() , START() , , .



    public Condition myCondition;

    void Start(){
        myCondition = new Condition("");
        myCondition.setedSeconds = 120; // 2 
        myCondition.setedSkips = 5;
        myCondition.START(); //      
    }

    //    
    public void FinishRound(){
        myCondition.NextSkip(); //  ,  

        if (myCondition.IsReady())
        {
            //    ,      ...

            myCondition.START(); //   START()    . ,     IsReady == true
        }
    }


, , — List &ltint&gt checkPoints. - , , , ., , - . , : , ( , ). , Sheduler , , — .



    public Condition myCondition;

    void Start(){
        myCondition = new Condition("",new List<int> { 1, 2, 5 }); //    ,   
        myCondition.setedSeconds = 120;
        myCondition.setedSkips = 5;
        myCondition.START();
    }

    public void FinishRound(){
        myCondition.NextSkip(); 

        if (myCondition.IsReady() || myCondition.HasCheckPoint(currentLevel)) //          
        {
            //    ,      ...

            myCondition.START();
        }
    }


, , =) AutoInvoke(Action CallBack, int checkPoint = 0) , NextSkip() START() , START() .



    public Condition myCondition;

    void Start(){
        myCondition = new Condition("",new List<int> { 1, 2, 5 });
        myCondition.setedSeconds = 120;
        myCondition.setedSkips = 5;
        myCondition.START(); 
    }

    public void FinishRound(){

        myCondition.AutoInvoke(() => Debug.Log("hello World"), currentLevel); 
        //   currentLevel,                                                                                
    }




Ein Bedingungsobjekt hilft Ihnen dabei, schnell eine Reihe notwendiger Bedingungen für den Betrieb einer Funktion bereitzustellen !!!



Wenn Ihre Aufgabe in der technischen Aufgabe etwas schwieriger ist als ein einfacher Anruf, z. B. ein Anruf jedes Mal oder nach einiger Zeit, ist es bereits nützlich, auf eine Bedingung zurückzugreifen, da dies Abstraktion und Lesbarkeit ist - Sie müssen sie nur starten und ihre Bereitschaft überprüfen.




Ich habe den Bedingungsfeldern einige nützliche Einheitenattribute hinzugefügt, um die Initialisierung durch den Inspektor zu vereinfachen!





Die Hauptsache ist Flexibilität, und wenn plötzlich jemand seine eigene Funktionalität entwickelt, die nicht mit Ihrem Zustand in Konflikt stehen sollte, müssen Sie nur einen allgemeinen Planer erstellen ...






nächste Aufgabe



Fügen Sie flexibel verschiedene Fenster (Funktionsaufruf) von verschiedenen Stellen im Programm hinzu, behalten Sie die Synchronisation bei und vermeiden Sie Overlay-Konflikte!






Lösung:



Und jetzt kommen wir zur Hauptklasse Sheduler, unserem Zustandsplaner!

Es ist besser, ein Objekt dieser Klasse so früh wie möglich zu initialisieren. Insbesondere in einer Einheit ist es besser, dass das Objekt DontDestroyOnLoad ist .



Wenn Sie in Sheduler schauen , sehen Sie die folgenden Felder:



  1. Aktueller Prüfpunkt int currentheckPoint
  2. Eine Sammlung aller hinzugefügten Bedingungen und ihres Verhaltens Dictionary & ltCondition, Action & gt ConditionHandlers - damit der

    Planer weiß, welche Rolle die fertige Bedingung spielen sollte
  3. Dictionary &ltint,Condition&gt CheckPoints — Sheduler, Dictionary, , . .
  4. Queue &ltCondition&gt WaitingConditions ,



Sheduler speichert das Verhalten jeder Bedingung und arbeitet gemäß dieser Klasse. Es wird zum Zeitpunkt des Hinzufügens der Bedingung public void Add (Bedingung newCondition, Action CallBack) festgelegt , wobei die Argumente einen erforderlichen Delegaten haben. Die Methode selbst liest den Bedingungsnamen und löst eine Ausnahme aus, wenn sie leer ist oder bereits hinzugefügt wurde. Dies ist erforderlich, wenn Sie aus irgendeinem Grund eine Bedingung aus dem Zeitplan mit dem Namen List & ltCondition & gt GetConditions (params string [] conditionName) übernehmen müssen . Außerdem führt die add-Methode Add () sofort Start () der hinzugefügten Bedingung aus. Dies ist nützlich, wenn Sie Start () ausführen.Die hinzugefügte Bedingung wird von welchem ​​der Entwickler vergessen, und auch um zu vermeiden, dass Sheduler diese Funktion ständig verlässt. Wenn Sie einen anderen Ort benötigen, um die Bedingung zu starten, arbeiten Sie einfach wie zuvor mit der Bedingung. Sie können ihre Zähler jederzeit ändern. Dies ist das Schöne an Sheduler: Es behandelt, wo die Bedingung bereit ist und wo es ihre Bereitschaft geändert hat, und führt diese Berechnung zum Zeitpunkt des Aufrufs seiner Hauptmethode Condition Invoke (params Condition [] badges) durch . In den Argumenten können Sie bestimmte Abzeichen angeben, dh diejenigen Bedingungen, die ausschließlich funktionieren sollen, und diejenigen, die an der Reihe sind, aber nicht in der Liste der Abzeichen aufgeführt sind. Dann funktionieren sie nicht. Wenn Sie jedoch nichts angeben, hat jeder das Recht, an der Spitze der Warteschlange anzurufen, wie es sein sollte!



Denken Sie daran, wo die Prüfpunkte für Sheduler NextCheckPoint () gezählt werden , z. B. bei der Methode, am Ende oder zu Beginn der Runde. Ein

vollständiges Beispiel dafür, was für die Arbeit mit dem Sheduler erforderlich ist:



    public Condition OfferBuyVip;
    public Condition OfferToShareWithFriends;
    public Condition OfferToVisitSite;

    public Sheduler OfferSheduler;

    public void Start(){
        OfferSheduler = new Sheduler(currentLevel); //      

        /*
         *         
         */

        OfferSheduler.Add(OfferBuyVip, () => Debug.Log("     VIP"));
        OfferSheduler.Add(OfferToShareWithFriends, () => Debug.Log("    "));
        OfferSheduler.Add(OfferToVisitSite, () => Debug.Log("     ,   "));
    }

    public void FinishRound(){
        OfferSheduler.NextCheckPoint(currentLevel); //  ,      
        OfferSheduler.Invoke(OfferBuyVip, OfferToShareWithFriends) //      ,    
    }

    public void StartRound(){
        OfferSheduler.Invoke(OfferToVisitSite); //     
        //   ,   ,           Sheduler
    }





Auf diese Weise haben wir sichergestellt, dass die drei Funktionen unserer Bedingungen an verschiedenen Orten aufgerufen werden, während sie sich gegenseitig respektieren und nicht alles in einer Reihe herauskriechen, sondern die Warteschlange (wie eine moderne digitale Warteschlange für Gutscheine) und den Benutzer respektieren, der schnell von der Ziellinie zum Start des Spiels springt wird die Anzahl der Vorschläge nicht belasten. Mit Sheduler bleibt eine klare Harmonie von Einfachheit und Flexibilität erhalten, da mit Sheduler und einem Delegierten, der über die Add-Methode (Condition newCondition, Action CallBack) an Sheduler übergeben wurde, jede Verbindung zwischen Fenstern implementiert werden kann.



Wenn Sie beispielsweise ein Werbebanner aufrufen, wird nach zwei Ebenen ein Angebot zum Kauf von Premium ohne Werbung angezeigt:



    void Start(){
        OfferSheduler = new Sheduler(currentLevel);

        callAddBanner = new Condition(" ");
        callAddBanner.setedSeconds = 80; //    80 
        OfferBuyVip = new Condition("  VIP  ");

        OfferSheduler.Add(callAddBanner, 
            delegate()
            {
                Debug.Log(" ");
                OfferBuyVip.setedSkips = 2; //   
                OfferBuyVip.START();  // 
            }
           );
        OfferSheduler.Add(OfferBuyVip,
            delegate ()
            {
                Debug.Log("     VIP");
                OfferBuyVip.setedSkips = 0; //  !  
 //,  
            }
           );
        }
        
        void Finish(){
            OfferSheduler.NextCheckPoint(currentLevel); //    
// 
            OfferSheduler.Invoke(); //     
//    
        }


Einfach so, jetzt wird alle 80 Sekunden eine nicht ablenkende Werbung ausgelöst (schließlich wird sie nicht während einer wichtigen Runde, sondern an der Ziellinie aufgerufen) und auch ein Angebot zum Kauf einer Werbung aufgerufen, wenn es für Sie günstig ist! Und das Beste ist, dass jetzt jeder Entwickler im Team seine Vorschläge zu Sheduler hinzufügen kann und Sheduler alles verteilt.



All Articles