Lassen Sie uns über die Interaktionseinstellungen zwischen UIWidgets und 3D sprechen. UIWidgets gibt offiziell an, dass es mit 3D interagieren kann. Wenn Sie beispielsweise direkt in Unity arbeiten, ist es normal, auf eine Schaltfläche zu klicken, um eine Transformation von Position, Drehung und Zoom auszulösen. Wenn sich diese jedoch kontinuierlich ändert, bleibt der Bildschirm hängen.
Im obigen Bild habe ich eine Schaltfläche mit der Schaltfläche für die automatische Drehung und eine Schaltfläche für die UIWidgets auf der Benutzeroberfläche hinzugefügt. Sie können sehen, dass sich das Quadrat der Szenenszene im laufenden Zustand weiter dreht, aber die Drehung des Spiels Szene wird ziemlich Caton sein. Der Grund für dieses Phänomen liegt darin, dass die Benutzeroberfläche von UIWidgets im Vordergrund steht und der Aktualisierungsmechanismus von UIWidgets darin besteht, dass die Schnittstelle grundsätzlich nicht aktualisiert wird, wenn sich die Schnittstelle nicht ändert oder setstate () nicht aufgerufen wird, sondern der Cube sich alle ändert Rahmen, so Dies führte zu dem Phänomen einer Karte eine Karte.
Wenn Sie den Grund kennen, ist es einfach, ihn zu lösen. Lassen Sie einfach die Benutzeroberfläche jeden Frame aktualisieren. Ich habe eine echte Schleife im UIWidgets-Skript ausgeführt. Jeder Frame löst ein leeres SetState () -Ereignis aus (wenn Sie setState nicht verstehen, können Sie den Spülmechanismus von Fluter verstehen), und dann ist die 3D-Anzeige normal. Aber es fühlt sich komisch an, weil jeder Frame aktualisiert wird und der Drawcall wieder auftaucht. . .
Später, nach Rücksprache mit dem Entwickler von UIWidgets, gab die andere Partei die richtige Methode an, nämlich die beiden Delegaten von Windows auf leere Methoden zu setzen, wenn UIWidgetsPanel initialisiert wird.
Window.onFrameRateSpeedUp = ()=> { };
Window.onFrameRateCoolDown = ()=> { };
Dieser Punkt wird auf dem offiziellen Github der offiziellen UIWidgets erklärt. Es ist nur so, dass die Schnittstelle des internationalen Servers zu diesem Zeitpunkt versehentlich geöffnet wurde. Es war alles auf Englisch, aber ich habe es nicht gefunden. Dann, wegen des obigen Tests Ich dachte, dass UIWidgets die UI nicht ausführen können und die 3D-Interaktion leidet wirklich unter schlechtem Englisch. . . Seufzen Sie noch einmal für die Großartigkeit von UIWidgets!
Als nächstes folgt die interaktive Operation von UIWidgets für den 3D-Code, da UIWidgets dynamisch generiert werden und die Klassen, die UIWidgetsPanel, StatefulWidget und StatelessWidget erben, nicht mit der MonoBehaviour-Klasse identisch sind. Sie können ein öffentliches GameObject oder Transform nicht direkt deklarieren und dann ziehen Direkt referenzieren, benutzerdefinierte Klassen sind nicht in Ordnung. Mein eigener Ansatz besteht darin, eine Singleton-Klasse zu schreiben, um auf diese Klassen und Objekte zu verweisen, und sie dann auf die leeren Objekte der Szene zu hängen, damit ich UIWidgets-Klassen verwenden kann, um direkt zu referenzieren der Singleton anzurufen.
Da MonoBehaviour nicht direkt geerbt wird, ist die Coroutine-Methode nicht verfügbar, die vorhandenen Methoden von UIWidgets können jedoch weiterhin zur Simulation der Coroutine verwendet werden
void Refresh()
{
Promise.Delayed(TimeSpan.FromSeconds(0.3f)).Then(
() =>
{
//dosomethings
setState();
Refresh();
}
);
}
Die obige Methode kann das Aktualisierungsereignis nicht auslösen. Zu Beginn habe ich dies verwendet, um die Aktualisierung der Schnittstelle zu erzwingen, um den Effekt der synchronen Aktualisierung der 3D-Schnittstelle zu erzielen. Promise ist eine Klasse von UIWidgets, die für asynchrone Operationen und die Verarbeitung verwendet werden sollten Warteschlangen usw. Tools.
Grundsätzlich muss UIWidgets mit 3D interagieren. Ändern Sie es einfach entsprechend der obigen Konfiguration. Dann ist der nächste Schritt, über den App-Teil zu sprechen!