Wenden Sie MVVM in Unity3D mit NData an



    Hallo! In diesem Beitrag möchte ich Ihnen, meinem Lieblings-Hubr, ein Plugin vorstellen, das meine Produktivität bei der Arbeit mit der Benutzeroberfläche mehrmals gesteigert hat. Der Link, mit dem ich arbeite, lautet wie folgt: Unity3D + NGUI + NData . Auf Wunsch kann IoC + DI verwendet werden, es wurde jedoch noch keine ideale Option für iOS, Android und WinPhone gefunden.

    Sie können über das Muster hier oder hier lesen . Einer der Vorteile dieses Ansatzes ist die Datenbindung, d.h. Verknüpfen einer Ansicht mit Daten und automatische Benachrichtigung, wenn diese Daten in die gewünschte Ansicht geändert werden.

    Informationen zum NData-Plugin finden Sie auf der Website . Und ja, es kostet 45 $)

    (im Bild oben eines der letzten Spiele, die ich mit Unity3d + NGUI + NData erstellt habe)

    Wie

    früher mussten Sie für die Benutzeroberfläche eine oder mehrere Klassen (GUIManager, MenuView, GameViewetc.) erstellen, die Links zu Komponenten enthielten visuelle Elemente (UILabel, UISprite, UIGrid usw.). Außerdem musste diese Komponente an einer bestimmten Stelle aktualisiert werden. Mein Meinungswechsel fand in den gleichen Klassen statt. Es wurden jedoch ähnliche Aktionen ausgeführt, z. B . : -
    Abhängig von der Variablen des Bool-Typs wird das Element
    angezeigt / ausgeblendet. - Aktualisieren Sie den Text, wenn sich die Variable des Zeichenfolgentyps geändert hat. -
    Wenn eine Bedingung erfüllt ist, z. B. Punkte> 5, wird das Element angezeigt / ausgeblendet

    Das heißt Ich musste die ganze Zeit die gleiche Art von Code schreiben. Es begannen sich Gedanken zu machen, wie man das vereinfachen kann. Und dann ...

    Einführung in NData

    Mein Freund hat mir einmal von NData erzählt. Und als er demonstrierte, wie die Liste der Elemente im Raster mit zwei Komponenten und einer Eigenschaft gefüllt und verwaltet wird, war ich erstaunt. Hier ist es, Entwicklungsgeschwindigkeit!

    Ich werde eine Liste von Funktionen aus zitieren. Website:
    - Zweiwege-Textbindungen (einschließlich Mehrfachbindungen) mit nativen .NET-Formatierungsfunktionen.
    - Zweiwege-Schwimmerbindungen für Slider.
    - Flexible Bindungen, mit denen sichtbare und überprüfte Zustände von UI-Steuerelementen an Eigenschaften in Ihrem Code gebunden werden können (auch im bidirektionalen Modus für Kontrollkästchen, die an Boolesche Werte gebunden sind).
    - Befehlsbindungen für Schaltflächen, die Aktionen in Ihrem Code auslösen.
    - Quellbindung für Elemente zur Verbindung der Listensteuerung mit einer angehängten Elementvorlage zur Sammlung von Elementen in Ihrem Code.
    - Codefragmente für meldepflichtige Eigenschaften und Sammlungen für Visual Studio und Mono Develop.
    - Editor-Skript für die Bindungsvalidierung.

    Wie Sie sehen, kann fast jede Anwendung auf dieser Liste von Ordnern aufgebaut werden. Was ich in letzter Zeit tatsächlich getan habe.

    Nicht alles ist wirklich so glatt. Nach dem Import des Plugins treten Fehler auf und müssen behoben werden. Ich habe die Videos aufgezeichnet, wie man das Plugin installiert, wie man mit Komponenten arbeitet usw.

    Was ist eine Bindung? Dies ist ein reguläres MonoBehaviour-Skript, das ein bestimmtes Benutzeroberflächenelement durch Reflektion mit einer Variablen im Code verknüpft. Die Variable wird von einem speziellen generischen Typ (z. B. Eigenschaft) erstellt, mit dem Sie über die Änderung dieser Variablen benachrichtigt werden können.


    (Bindung von Text in einer Variablen mit Text in UILabel)


    (Bindung eines Klickereignisses an eine Methode)

    Beispiel mit einem Raster:
    1.Erstellen Sie eine Sammlung von Ansichten (+ die Ansicht selbst), die in das Raster / die Tabelle gepackt werden sollen
    private readonly EZData.Collection _privateItems = new EZData.Collection(false);
    public EZData.Collection Items { get { return _privateItems; } }
    


    2. Wir binden es durch Binden an die Tabelle / das Raster und weisen ein Fertighaus zu, an das wir die Ansicht des Tabellenelements anhängen:


    3. Irgendwo im Code arbeiten wir mit der Auflistung (Hinzufügen, Entfernen, Löschen, GetItem (n)) und alle Änderungen werden auf dem Bildschirm angezeigt .
    ...
    Items.Add(new ProductItemContext(prod));
    ...
    


    Ready-Code kann aus Vorlagen / Snippets eingefügt werden .

    Traurigkeit

    Es wäre sehr schön, wenn dies nicht die Geschwindigkeit der Anwendung beeinträchtigen würde.) Dieselbe VisibilityBinding durchläuft die gesamte Hierarchie des Objekts und deaktiviert UIWidget. Das heißt GetComponents () zuckt die ganze Zeit, was traurig ist.
    ...
    	private void SetVisible(Transform tr, bool visible)
    	{
    		foreach(var collider in tr.GetComponents())
    		{
    			collider.enabled = visible;	
    		}
    		foreach(var widget in tr.GetComponents())
    		{
    			widget.enabled = visible;
    		}
    	}
    ...
    


    Hier ist eine Möglichkeit, nach Textänderungen zu suchen.
    void Update(){
       if(_characterName != NewCharacterName){
          _characterName = NewCharacterName;
       }
    }
    

    Der Quellcode sagt etwas anderes, aber das Prinzip ist dasselbe.

    Alle meine Optimierungshacks endeten mit der Vererbung der NguiBaseBinding-Klasse von CachedMonoBehaviour, in der transform und gameObject zwischengespeichert werden. Es gibt eine Idee, wie GetComponent-Konstanten optimiert werden können: Erstellen Sie ein Flag für Ordner, das angibt, dass das Element statisch ist und seine Komponenten zwischengespeichert werden können. Erstellen Sie eine eigene GetComponent-Implementierung, die die Komponente anhand des Flags aus dem Cache entnimmt. Aber es sieht aus wie eine Krücke für eine Krücke.)

    Im Allgemeinen ist es in einer Situation, in der Sie häufig die Sichtbarkeit ändern müssen, einfacher, das Element auf einige transzendentale Koordinaten zu übertragen. Es ist viel schneller, wenn Sie beispielsweise das Fenster mit vielen Elementen ausschalten und es einfach auf x: 10000 übertragen y: 10000 z: 0 und es besteht keine Notwendigkeit, die gesamte Hierarchie zu durchlaufen und nach Komponenten zu suchen).

    Total

    Jetzt ist das Sammeln der Benutzeroberfläche viel lustiger und einfacher geworden. Die Liste der Ordner deckt fast alle Abfragen ab. Wenn plötzlich etwas fehlt, können Sie ganz einfach Ihre eigene Bindung hinzufügen. Ich benutze sowohl für Spielzeug als auch für Geschäftsanwendungen.

    Dies ist natürlich keine "goldene Kugel", aber die Vielseitigkeit dieser Lösung ist erstaunlich. Ich verwende es in Verbindung mit Uniject (IoC + DI, das unter WinPhone wirklich nicht funktioniert). Daher habe ich NullReferenceException lange vergessen (ich muss mich nicht um das Erstellen / Zerstören von Objekten und das Einrichten von Verweisen auf Objekte kümmern) und Sie können das Modell / die Dienste / Ansichten einfach ersetzen.

    Khabrahabrovtsy, bitte teilen Sie Ihre Erfahrung in der Entwicklung von Schnittstellen!

    Vielen Dank für Ihre Aufmerksamkeit!

    PSNach der Veröffentlichung des Spiels gab es viele Schreie, dass dies ein Spiel von Perversen ist / für Perversen / der Name ist das Schlimmste in der Welt / störrischer Bär usw. Wir dachten nicht, dass jeder einen Namen haben würde, der ausschließlich mit dem berüchtigten Pedobir in Verbindung gebracht wird.) Haben sie etwas gemeinsam, außer Harmonie? Änderte den Namen)

    Jetzt auch beliebt: