Разработка приложений Unity на основе UIWidgets (3)

      Давайте поговорим о настройках взаимодействия между UIWidgets и 3D. UIWidgets официально указывает, что он может взаимодействовать с 3D. Однако, если вы работаете непосредственно в Unity, например, нормально щелкнуть кнопку, чтобы вызвать преобразование положения, поворота и масштабирования, но если оно постоянно изменяется, экран застревает.

        На изображении выше я добавил кнопку с кнопкой автоматического поворота и кнопку UIWidgets в интерфейсе. Вы можете видеть, что в рабочем состоянии квадрат сцены сцены будет продолжать вращаться, но вращение игры сцена будет вполне катонной. Причина этого явления заключается в том, что пользовательский интерфейс UIWidgets находится на переднем крае, а механизм обновления UIWidgets заключается в том, что если интерфейс не изменяется или не вызывается setstate (), интерфейс в основном не обновляется, но куб меняется каждый раз. рамка, поэтому это привело к явлению одной карты на одну карту.

        Если вы знаете причину, ее легко решить, просто позвольте пользовательскому интерфейсу обновлять каждый кадр. Я запустил настоящий цикл в скрипте UIWidgets. Каждый кадр запускает пустое событие SetState () (если вы не понимаете setState, вы можете понять механизм промывки fluter), а затем трехмерное отображение является нормальным. Но это кажется странным, потому что каждый кадр обновляется, снова появляется вызов отрисовки. . .

        Позже, после консультации с разработчиком UIWidgets, другая сторона предоставила правильный метод, который должен установить два делегата Windows на пустые методы при инициализации UIWidgetsPanel.

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

        Этот момент объясняется на официальном github официальных UIWidgets. Просто в то время случайно был открыт интерфейс международного сервера. Все было на английском, но я его не нашел. Затем из-за теста выше , Я думал, что UIWidgets не может делать UI, а 3D-взаимодействие действительно страдает от плохого английского. . . Еще раз вздохните за великолепие UIWidgets!

        Далее следует интерактивная операция UIWidgets в 3D-коде, поскольку UIWidgets генерируются динамически, а классы, наследующие UIWidgetsPanel, StatefulWidget и StatelessWidget, не совпадают с классом MonoBehaviour. Вы не можете напрямую объявить общедоступный GameObject или Transform, а затем перетащить это напрямую. Прямая ссылка, пользовательские классы недопустимы. Мой собственный подход состоит в том, чтобы написать одноэлементный класс для ссылки на эти классы и объекты, а затем установить его на пустые объекты сцены, чтобы я мог использовать классы UIWidgets для прямой ссылки синглтон Позвонить.

        Кроме того, поскольку он не наследует напрямую MonoBehaviour, метод сопрограммы недоступен, но существующие методы UIWidgets все еще можно использовать для моделирования сопрограммы.

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

Вышеупомянутый метод не может вызвать событие обновления. Вначале я использовал его для принудительного обновления интерфейса для достижения эффекта синхронного обновления трехмерного интерфейса. Promise - это класс UIWidgets, который следует использовать для асинхронных операций, обработки очереди и др. Инструменты.

        По сути, UIWidgets должен взаимодействовать с 3D, просто измените его в соответствии с приведенной выше конфигурацией. Следующий шаг - поговорить о приложении!

рекомендация

отblog.csdn.net/ssssssilver/article/details/107294672