Я использую оба этих фреймворка в течение некоторого времени. При использовании обоих фреймворков очень легко запутаться, поскольку у кого-то могут быть очень похожие результаты в обоих фреймворках. Вы можете получить тот же результат с UniTask, что и с UniRX, и наоборот.
Именно поэтому я хотел прояснить различия между фреймворками и рассказать о том, как я их использую.
UniRX — это функциональное/декларативное реактивное расширение. Это порт реактивных расширений .net. Реактивное программирование — это парадигма, ориентированная на поток данных. Мы интерпретируем все как некий поток и строим поток на основе изменений этого потока. ООП, с другой стороны, структурирует на основе состояний и иерархий объектов и запускает программу на основе набора инструкций, а не изменений в потоках.
UniRX основан на паттерне Observer и реализует многие реактивные операторы и некоторые специфические операторы для Unity3D. Эти специфичные для Unity операторы также являются некоторыми обходными путями для известных ограничений в Unity3D. Например, добавляя вместо добавления метода Update ко всем сценариям, вы можете использовать Observable.EveryUpdate, который реализует менеджер и опосредует логику обновления от этого менеджера. Это намного эффективнее, чем использование методов Update в сценариях.
UniTask — это библиотека для модели асинхронного программирования в Unity3D. Хотя в сценариях можно использовать простой await/async, UniTask представляет более конкретные реализации Unity3D, которые более эффективны, чем использование простых. UniTask также представляет некоторые помощники для Unity, такие как DelayFrame.
Модель асинхронного программирования пытается упростить многопоточное программирование. Раньше в .Net были разные модели для асинхронных задач. Последней является модель программирования Async с ключевыми словами async/await. Я не буду вдаваться в технические детали, но основная цель — назначать задачи рабочим потокам, сохраняя максимально возможную отзывчивость приложения, оставляя основной поток ленивым. Модель асинхронного программирования — это упрощенный способ управления этим распределением работы и управлением потоками, поэтому программисты могут сосредоточиться на продукте, а не на технических деталях.
После этих объяснений становится ясно, что даже если у вас может быть одинаковая логика с обоими этими фреймворками/подходами, их основная цель совершенно различна. UniRx — это реактивное расширение, позволяющее реактивно интерпретировать логику, а UniTask — это библиотека асинхронного программирования.
В то время как UniRx позволяет использовать организацию отношений между классами на основе изменений в данных и потоке, UniTask упрощает реализацию логики в асинхронном режиме.
Иногда я оказываюсь в ситуации, когда пытаюсь использовать это, потому что у меня обычно есть оба в моих проектах.
В таких ситуациях я спрашиваю себя
- Если речь идет об изменении данных
- Если это задача, которую нужно выполнять параллельно
Ответ на эти вопросы говорит мне, что использовать в значительной степени.