Desarrollo de aplicaciones Unity basado en UIWidgets (3)

      Hablemos de la configuración de interacción entre UIWidgets y 3D. UIWidgets indica oficialmente que puede interactuar con 3D. Sin embargo, si opera directamente en Unity, por ejemplo, es normal hacer clic en un botón para activar una transformación de posición, rotación y zoom, pero si cambia continuamente, la pantalla se bloqueará.

        En la imagen de arriba, agregué un botón con el botón de rotación automática y agregué un botón UIWidgets en la interfaz. Puedes ver que en el estado de ejecución, el cuadrado de la escena continuará girando, pero la rotación del juego La escena será bastante Caton. La razón de este fenómeno es porque la interfaz de usuario de UIWidgets está a la vanguardia, y el mecanismo de actualización de UIWidgets es que si la interfaz no cambia o no se llama a setstate (), la interfaz básicamente no se actualiza, pero el cubo cambia cada marco, por lo que esto llevó al fenómeno de una tarjeta una tarjeta.

        Si conoce el motivo, es fácil de resolver, simplemente deje que la interfaz de usuario actualice cada cuadro. Ejecuté un bucle verdadero en el script UIWidgets. Cada fotograma desencadena un evento SetState () vacío (si no comprende setState, puede comprender el mecanismo de descarga de fluter), y luego la visualización en 3D es normal. Pero se siente extraño, porque cada cuadro se actualiza, la llamada de emergencia vuelve a aparecer. . .

        Más tarde, después de consultar con el desarrollador de UIWidgets, la otra parte dio el método correcto, que es configurar los dos delegados de Windows en métodos vacíos cuando se inicializa UIWidgetsPanel.

Window.onFrameRateSpeedUp = ()=> { };
Window.onFrameRateCoolDown = ()=> { };

        Este punto se explica en el github oficial de UIWidgets oficiales. Es solo que la interfaz del servidor internacional se abrió accidentalmente en ese momento. Todo estaba en inglés, pero no lo encontré. Luego, debido a la prueba anterior , Pensé que UIWidgets no podía hacer la interfaz de usuario y la interacción 3D realmente sufre de mal inglés. . . ¡Vuelve a suspirar por la genialidad de UIWidgets!

        La siguiente es la operación interactiva de UIWidgets en el código 3D, porque UIWidgets se generan dinámicamente y las clases que heredan UIWidgetsPanel, StatefulWidget y StatelessWidget no son las mismas que la clase MonoBehaviour. No puedes declarar directamente un GameObject o Transform público y luego arrastrar directamente. Referencia directa, las clases personalizadas no están bien. Mi propio enfoque es escribir una clase singleton para hacer referencia a estas clases y objetos, y luego montarla en los objetos vacíos de la escena, de modo que pueda usar clases UIWidgets para hacer referencia directa el singleton para llamar.

        Además, debido a que no hereda directamente MonoBehaviour, el método de corrutina no está disponible, pero los métodos existentes de UIWidgets aún se pueden usar para simular la corrutina

        void Refresh()
        {
            Promise.Delayed(TimeSpan.FromSeconds(0.3f)).Then(
                () =>
                {
                            //dosomethings
                            setState();
                    Refresh();
                }
                );
        }

El método anterior no puede activar el evento de actualización. Al principio, utilicé esto para forzar la actualización de la interfaz para lograr el efecto de actualizar sincrónicamente la interfaz 3D. Promise es una clase de UIWidgets, que debe usarse para operaciones asincrónicas, procesamiento colas, etc. Herramientas.

        Básicamente, UIWidgets necesita interactuar con 3D, simplemente cámbielo de acuerdo con la configuración anterior. ¡Entonces el siguiente paso es hablar sobre la parte de la aplicación!

Supongo que te gusta

Origin blog.csdn.net/ssssssilver/article/details/107294672
Recomendado
Clasificación