添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
public class Enemy { public string Name { get; set; } };
public class Slime : Enemy { };
public class Drakee : Enemy { };
/// <summary>
/// 型を変換し、失敗時はonErrorを発行する
/// </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 = "スライム" });
    // cast失敗
    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 = "スライム" });
    // cast失敗
    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");

各要素が発行されています。

/// メッセージにonNext,onError,onCompletedの情報を付与 /// </summary> private void ExcuteMaterialize() { // onNextとonComplete IObservable<int> stream = Observable.Range(0, 3); Observable .Materialize(stream) .Subscribe(x => { Debug.Log("Materialize onNext : <color=blue>" + x + "</color>"); }, () => { Debug.Log("Materialize onComplete"); // onError 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>
/// メッセージをUnit型に変換したい
/// </summary>
private void ExcuteAsUnitObservable()
    Observable
        .Range(0, 3)
        .AsUnitObservable()
        .Subscribe(x => {
            Debug.Log("AsUnitObservable onNext : " + x);
        }, () => {
            Debug.Log("AsUnitObservable onCompleted");

Rangeで0~2の値を流そうとしていますが、Unit型になっています。