UniRx について

目次

  1. UniRxとは  
  2. UniRxの使い方 
  3. UniRxのメリット
  4. 参考サイト

目次

  1. UniRxとは
  2. UniRxの使い方
  3. UniRxのメリット
  4. 参考サイト
1.UniRxとは
  • UnityのAssetStoreでダウンロードできるアセット
  • Unity向けに作られた非同期処理向けC#ライブラリ
  • デザインパターンの一つであるObserverパターンがベース
  • 時間に関係した処理ができる
  • 任意のタイミングでの処理ができる
    例)毎秒処理をする
    例)スコアが増えた時にUIの表示を更新する
1.UniRxとは
  • 構成要素
    Subject(通知する側)クラス
    Observer(通知される側)クラス
  • SubjectがObserverに通知すると,Observerが処理する
  • Subjectは処理するタイミングを決める
  • Observerは何を処理するかを決める

目次

  1. UniRxとは
  2. UniRxの使い方
  3. UniRxのメリット
  4. 参考サイト
2.UniRxの使い方
//サブジェクト
Subject<T> subject = new Subject<T>();
//オブサーバ, action:処理する関数
IObserver<T> observer = Observer.Create<T>(Action<T> action);
//オブサーバの登録(購読)
subject.Subscribe(observer);
//オブサーバに通知(発行),value:通知するT型の値
subject.OnNext(value);
2.UniRxの使い方

例)毎秒UIを更新する

public class Counter : MonoBehabiour{
	private Subject<int> subject = new Subject<int>();
	public IObservable<int> subscriber{ get { return subject; }}
	
	void Update(){
		if(/*1秒経つたび*/)
			subject.OnNext(time);
	}		
}

public class UIManager : MonoBehabiour{
	[SerializeField] private Counter counter;
	void Start(){
		IObserver<T> observer = Observer.Create<T>(/*UIを更新する関数*/);
		counter.subscriber.Subscribe(observer);
	}
	
	void UIUpdate(int time){
		//UIを更新する
	}
}
2.UniRxの使い方

例)Counterの説明1

public class Counter : MonoBehabiour{
 //中身
}
  • Counterは毎秒オブサーバに時間を通知するコンポーネント
  • 今回はUIManagerコンポーネントで作ったオブサーバに通知している
2.UniRxの使い方

例)Counterの説明2

	public IObservable<int> subscriber{ get { return subject; }}
  • subjectは登録と通知の機能を所有するもの
  • IObservableは登録の機能のみを所有するもの
  • すなわち上記はsubjectから登録機能のみ取り出している
2.UniRxの使い方

例)Counterの説明3

		if(/*1秒経つたび*/)
			subject.OnNext(time);
  • オブサーバに毎秒時間を通知する
  • 1秒経過したことを得る方法はいろいろあると思いますが,簡略化のためここでは省いています
2.UniRxの使い方

例)UIManagerの説明

public class UIManager : MonoBehabiour{
	[SerializeField] private Counter counter;
	void Start(){
		IObserver<int> observer = Observer.Create<int>(UIUpdate);
		counter.subscriber.Subscribe(observer);
	}
	
	void UIUpdate(int time){
		//UIを更新する
	}
}
  • UIManagerでは最初にUIをUpdateする関数からオブサーバを作り,Counterにオブサーバを登録する

目次

  1. UniRxとは
  2. UniRxの使い方
  3. UniRxのメリット
  4. 参考サイト
3.1 短い文章で書ける
  • 時間に関係した処理は複雑で長いコードになりがち
  • UniRxを使うことで簡潔に書くとことができる
3.2 依存関係の逆転
  • 依存関係がA->Bであるとき, AがBに通知することで, 依存関係を逆転できる インターフェースを使えばUniRxは必要ないかもしれません 個人的に思ったことなので間違っているかもしれません
3.2 依存関係の逆転

例)Playerがダメージを与えたときに,ダメージをUIに表示する

  • PlayerがUIを表示するのではなく, PlayerがUIMamagerなどにダメージを通知することで, UIがPlayerに依存するようになる
3.3 継承の回避
  • 継承は依存が強すぎて使いにくいので委譲にしたい
  • 委譲とは機能を他のオブジェクトの利用により委ねること
  • スーパークラスが処理のタイミング, サブクラスが処理の内容を決めるとき, UniRxを使うとそれを委譲にすることができる インターフェースを使えばUniRxは必要ないかもしれません 個人的に思ったことなので間違っているかもしれません
3.3 継承の回避

例)キャラによって攻撃を変える

  • キャラがどのような攻撃をするかを
    プロトタイプのクラスに送信することで可能にする

目次

  1. UniRxとは
  2. UniRxの使い方
  3. UniRxのメリット
  4. 参考サイト