.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
);
}
Generate 是 UniRX 中未包含的运算符。
您可以尝试使用 Operator Observer Base 或使用 Create 运算符创建您自己的生成版本。
你到底想做什么?也许我可以以某种方式帮助你。
我尝试过......这是工作。但不知道这样可以吗? =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();
});
});
}
我知道这个问题可能已经过时了。但我还是会回答。
如果您想使用随机时间的计时器,那么您应该从这个问题开始发帖。因为从代码示例中了解您真正想要什么需要花费额外的时间。
答案如下:
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();
}
}