UniRX相信很多unity开发者也用过,其特点是进行响应式编程,适合处理复杂的事件流(如 UI 交互、网络请求序列)、需要组合多个异步操作的场景。

但是现在,UniRX已停更,官方Github仓库Unity资源商城停更很久。商城最后是在2019提交,Guthub仓库则是在2024年2月份归档,取而代之的是R3

https://github.com/Cysharp/R3

将不再局限于unity平台,支持更多平台

安装

因为R3不再局限于某一个开发框架,即使不添加特定的平台支持,也可以只使用核心库。但是,通过将标准 TimeProvider 和 FrameProvider 替换为针对每个平台优化的 Rx ,Rx 变得更加用户友好。例如,虽然标准的 TimeProvider 是基于线程的,但为每个平台使用基于 UI 线程的 TimeProvider 可以消除通过 ObserveOn 进行分派的需要,从而提高可用性。此外,由于消息循环因平台而异,因此使用单个 FrameProvider 是必不可少的。尽管为以下平台提供了标准支持,但通过实现 TimeProviderFrameProvider,可以支持任何环境,包括内部游戏引擎或其他框架。

R3 的最低 Unity 支持是Unity 2021.3版本,团结基于2022版本,理论上也是支持的。安装分为两步,安装NuGetForUnity和导入R3包

安装NuGetForUnity

首先在unity中安装NugetForUnity,通过Nuget安装核心代码。

Github仓库:

https://github.com/GlitchEnzo/NuGetForUnity

在unity的包管理器中,通过git添加本包,地址如下

https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity

将NuGetForUnity包导入到Unity内;安装完成后可以在工具栏中看到NuGetForUnity的下拉框,在这里打开manager。自带的包地址在国内访问可能有问题,即打开manager时没有包以及报错,这里去项目设置里的NugetForUnity设置,设置一个新地址:

https://www.nuget.org/api/v2/

安装R3

然后打开Nuget Manager界面,在Search内搜索R3,下拉找到R3包

点击R3然后Install ,完成本部分的安装。

导入R3 unity平台包

这里也是通过unity包管理器导入一个githun上的包

image-ZYrJ.png

https://github.com/Cysharp/R3.git?path=src/R3.Unity/Assets/R3.Unity
 
指定版本包,#1.0.0是版本
https://github.com/Cysharp/R3.git?path=src/R3.Unity/Assets/R3.Unity#1.0.0

使用

在使用时需要进行一次全局初始化默认参数(必须)。不需要特意调用,启动时会自动回调。

using System;
using R3;
using UnityEngine;
 
namespace Script.AOT.Main
{
    /// <summary>
    /// 初始化R3响应式编程
    /// </summary>
    public static class UnityProviderInitializer
    {
        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
        public static void SetDefaultObservableSystem()
        {
            SetDefaultObservableSystem(static ex => UnityEngine.Debug.LogException(ex));
        }
 
        public static void SetDefaultObservableSystem(Action<Exception> unhandledExceptionHandler)
        {
            ObservableSystem.RegisterUnhandledExceptionHandler(unhandledExceptionHandler);
            ObservableSystem.DefaultTimeProvider = UnityTimeProvider.Update;
            ObservableSystem.DefaultFrameProvider = UnityFrameProvider.Update;
        }
    }
}

使用时和UniRX用法大体一致,其中更改了函数名,这是官方函数名对照表,

 所以只要会原来的UniRX,这个也差不多,只需要修改原来的名称即可。

官方文档:

https://filzrev.github.io/R3/articles/index.html