LoginSignup
1
2

More than 3 years have passed since last update.

【さちゃでもわかる】UniRx入門編①

Posted at

はじめに

以前書いた記事でUniRxの導入をしてみました.
本当はやりたいことがたくさんあったのですが書いているうちに脱線して行ってしまったので,何回かに分けてやっていけたらと思っています.
UniRxでよく出てくる言葉の説明をしていきたいと思います.
参考までに前回の記事を載せておきます.

参考:【さちゃでもわかる】UniRx導入編

イベントの発行と購読

前回の記事でも述べましたが,UniRxのではイベントという概念が鍵となっています.
UnityではよくButtonのイベントに関数を紐付けたり,イベントシステムを使ってボタンを押した時の処理や,ポインターが乗った時などの処理を加えてきたと思います.
この時Buttonが行っているのがイベントの発行で,私たちが記述していたのがイベントの購読,つまり振る舞いの設定になります.
UniRxでもやることは変わりませんが,より自由になるので少し難しく感じるかもしれません.

というのも,今までイベントの発行はUnity独自のものを使っていたので,局所的な部分(ボタンのClick判定など)で使うことが主流でした.
しかし,UniRxではなんでもイベントにできます.Textの内容が変化したときや,int,enum,string,独自クラス,どんな変化もイベントとして扱うことができます.(これまでもUpdateで監視し続けたり,他にもいい方法はあると思いますが初学者の自分はよく知らないのですみません)
詳しくは何度も載せていますがこの辺が参考になると思います.

参考:OnNextとSubscribe

IObserverとIObservable

ここではUniRxを使う際基本となる2つのインターフェースについて紹介します.
それがIObserverIObservableです.

【IObserver】

IObserverインターフェースは、「イベントメッセージを発行できる」という振る舞いを定義したインターフェースです.
このインターフェースの定義は以下のようになっています.(引用元はこちら)

using System;

namespace UniRx
{
    public interface IObserver<T>
    {
        void OnCompleted();
        void OnError(Exception error);
        void OnNext(T value);
    }
}

つまり,IObserverインターフェースを継承したりなんなりすれば,OnNext,OnCompleted,OnErrorの3つのメソッドが定義されているので(ここら辺はインターフェースの部分が絡んでくるのでちょっとニュアンス歪んでいます),これらを使ってイベントの各所でデータを流すことができます.

【IObservable】

IObservableインターフェースは、「イベントメッセージを購読できる」という振る舞いを定義したインターフェースです.
このインターフェースの定義は以下のようになっています.(引用元はこちら)

using System;

namespace UniRx
{
    public interface IObservable<T>
    {
        IDisposable Subscribe(IObserver<T> observer);
    }
}

こちらもIObservableインターフェースを継承なりなんなりすることで,Subscribeのメソッドが実行でき,イベントが発行された際に走らせる関数の登録ができます.

Subject

UniRxの記事を調べているとSubjectがめちゃくちゃ出てくると思います.
これは先ほど述べた,IObserverインターフェースIObservableインターフェースの2つを実装しているクラスになります.
実際にSubjectの定義は以下のようになっています.

using System;
using System.Collections.Generic;
using System.Text;
using UniRx.InternalUtil;

namespace UniRx 
{
    public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T>
    {
        object observerLock = new object();
        public void OnCompleted()
        {
            ...
        {
        ...
    }
}

長いので省略しますが大事なところは以下の部分です.

public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T>

ここで継承しているISubject<T>の定義は以下のようになっています.

namespace UniRx
{
    public interface ISubject<TSource, TResult> : IObserver<TSource>, IObservable<TResult>
    {
    }

    public interface ISubject<T> : ISubject<T, T>, IObserver<T>, IObservable<T>
    {
    }
}

これより,ISubject<T>IObserverインターフェースIObservableインターフェースを実装しているので,ISubject<T>を継承するSubjectクラスもIObserverインターフェースIObservableインターフェースを実装していることになります.
したがって,両方のメソッドが利用できます.

OnNext/OnCompleted/OnError

IObserverインターフェース`に定義されていた3つのメソッドについてまとめると,

OnNext : 通常イベントが発行されたときに通知されるメッセージ
OnError : ストリームの処理中で例外が発生したことを通知する
OnCompleted: ストリームが終了したことを通知する

となります.

おわりに

最後まで読んでくださりありがとうございます.
書いてみて思ったのは,先人の方々はすごいなということです.
うまく言葉にできず参考に過去のQiitaを見ていたら,気付いたらほぼ内容としては同じものができてしまいました.
次回以降,もっと自分の言葉でまとめられるように精進していきます.

参考記事

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2