public class Enemy { public string Name { get; set; } };
public class Slime : Enemy { };
public class Drakee : Enemy { };
<summary>
</summary>
private void ExcuteCast() {
Subject<Enemy> subject = new Subject<Enemy>();
subject
.Cast<Enemy, Slime>()
.Subscribe(x => {
Debug.Log("Cast onNext : " + x.Name);
}, error => {
Debug.LogException(error);
}, () => {
Debug.Log("Cast onCompleted");
subject.OnNext(new Slime { Name = "スライム" });
subject.OnNext(new Drakee { Name = "ドラキー" });
subject.OnNext(new Slime { Name = "スライムベス" });
subject.OnCompleted();
スライムはSlime型に変換できるのでOnNextが発行されています。
ですが、ドラキーはDrakee型なので、Slime型に変換できずOnErrorが発行されます。
また、失敗した箇所以下のスライムベスとOnCompletedは通りません。
public class Enemy { public string Name { get; set; } };
public class Slime : Enemy { };
public class Drakee : Enemy { };
<summary>
</summary>
private void ExcuteOfType() {
Subject<Enemy> subject = new Subject<Enemy>();
subject
.OfType<Enemy, Slime>()
.Subscribe(x => {
Debug.Log("OfType onNext : " + x.Name);
}, error => {
Debug.LogException(error);
}, () => {
Debug.Log("OfType onCompleted");
subject.OnNext(new Slime { Name = "スライム" });
subject.OnNext(new Drakee { Name = "ドラキー" });
subject.OnNext(new Slime { Name = "スライムベス" });
subject.OnCompleted();
スライムはSlime型に変換できるのでOnNextが発行されています。
ドラキーはDrakee型なので、Slime型に変換できないので、無視されます。
そして、次のスライムベスとOnCompletedが呼ばれます。
private void ExcuteSelectManyObservable()
Subject<string> subject = new Subject<string>();
subject
.SelectMany(x => Observable
.Range(0, 3)
.Select(y => x + y.ToString()))
.Subscribe(x => {
Debug.Log("SelectMany OnNext : " + x);
} ,() => {
Debug.Log("SelectMany OnCompleted");
subject.OnNext("A");
subject.OnNext("B");
subject.OnNext("C");
subject.OnCompleted();
SelectManyで指定しているRangeの0~2の値と、OnNextでストリームに流れてくるA~Cの値が合成されています。
private void ExcuteSelectManyList()
List<string> list1 = new List<string> { "A", "B", "C" };
List<string> list2 = new List<string> { "D", "E", "F" };
List<string> list3 = new List<string> { "G", "H", "I" };
List<List<string>> listToList = new List<List<string>>();
listToList.Add(list1);
listToList.Add(list2);
listToList.Add(list3);
listToList
.ToObservable()
.SelectMany(lists => lists)
.Subscribe(x => {
Debug.Log("List Value : " + x);
}, () => {
Debug.Log("OnCompleted");
各要素が発行されています。
</summary>
private void ExcuteMaterialize() {
IObservable<int> stream = Observable.Range(0, 3);
Observable
.Materialize(stream)
.Subscribe(x => {
Debug.Log("Materialize onNext : <color=blue>" + x + "</color>");
}, () => {
Debug.Log("Materialize onComplete");
Observable
.Throw<Unit>(new Exception("Error Message"))
.Materialize()
.Subscribe(x => {
Debug.Log("Materialize onNext : <color=blue>" + x + "</color>");
メッセージにOn〇〇の情報が付与され、発行された値はかっこ内に入っています。
IObservable<Unit> input = this.UpdateAsObservable()
.Where(_ => Input.anyKeyDown);
Observable
.TimeInterval(input)
.Subscribe(x => {
Debug.Log("TimeInterval : " + x.Interval);
前回キーが押された時間から、今回押された時間の経過時間を表示しています。
IObservable<Unit> input = this.UpdateAsObservable()
.Where(_ => Input.anyKeyDown);
Observable
.Timestamp(input)
.Subscribe(x => {
Debug.Log("TimeStamp : " + x.Timestamp);
メッセージにタイムスタンプが付与されています。
Unit型とは、UniRxで定義されているイベントのタイミングや通知したいものが何も無いときに使用するものになります。
以下のようにSelectを使用することで同じことが出来ます。
Select(_ => Unit.Default)
メッセージをUnit型に変換したい
<summary>
</summary>
private void ExcuteAsUnitObservable()
Observable
.Range(0, 3)
.AsUnitObservable()
.Subscribe(x => {
Debug.Log("AsUnitObservable onNext : " + x);
}, () => {
Debug.Log("AsUnitObservable onCompleted");
Rangeで0~2の値を流そうとしていますが、Unit型になっています。