UniRx 没有 Observable.Generate() 方法

问题描述 投票:0回答:3

.NET Reactive Extensions 有一个巧妙的方法使用 corecursion 生成序列,称为 Observable.Generate

我在 UniRx(Unity Reactive Extensions)中找不到该方法的等效项。您能帮我将此代码示例移植到 UniRx 环境中吗?

public static IObservable<long> Timer(TimeSpan dueTime)
{
    return Observable.Generate(
        0L,
        i => i < 1,
        i => i + 1,
        i => i,
        i => dueTime
    );
}
c# unity-game-engine system.reactive unirx
3个回答
1
投票

Generate 是 UniRX 中未包含的运算符。

您可以尝试使用 Operator Observer Base 或使用 Create 运算符创建您自己的生成版本。

你到底想做什么?也许我可以以某种方式帮助你。


0
投票

我尝试过......这是工作。但不知道这样可以吗? =D

public static IObservable<DateTime> CreateRandomTimer(int minValue, int maxValue)
{
    return Observable.CreateSafe<DateTime>(observer =>
    {
        var random = new Random();

        var timer = new Timer
        {
            Enabled = true,
            Interval = random.Next(minValue, maxValue) * 1000
        };
        
        void OnTimerElapsed(object sender, ElapsedEventArgs e)
        {
            observer.OnNext(e.SignalTime);

            var currentTimer = (Timer) sender;
            currentTimer.Stop();
            currentTimer.Interval = random.Next(minValue, maxValue) * 1000;
            currentTimer.Start();
        }

        timer.Elapsed += OnTimerElapsed;
        timer.Start();

        return Disposable.Create(() =>
        {
            timer.Elapsed -= OnTimerElapsed;
            timer.Dispose();
        });
    });
}

0
投票

我知道这个问题可能已经过时了。但我还是会回答。

如果您想使用随机时间的计时器,那么您应该从这个问题开始发帖。因为从代码示例中了解您真正想要什么需要花费额外的时间。

答案如下:

using System;
using UniRx;
using UnityEngine;

public class TimerSample : MonoBehaviour
{
    [SerializeField] int minValue;
    [SerializeField] int maxValue;

    void Start()
    {
        int seconds = UnityEngine.Random.RandomRange(minValue, maxValue);
        TimeSpan period = TimeSpan.FromSeconds(seconds);
        Observable.Timer(period, Scheduler.MainThreadIgnoreTimeScale)
            .Subscribe(DoSomething)
            .AddTo(this);
    }

    private void DoSomething(long obj)
    {
        throw new NotImplementedException();
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.