ニートが学ぶUniRx Observerパターン

はいどーもこんばんは無職こじらせて道端に生えてるヨモギを食べてるニートです。
いつも参照させてもらってるとりすーぷさんご本人から「Observerパターンを自分で一度実装してみるといいよ」的なアドバイスをいただいたので、さっそく実践してみたいと思います。
まずはObserverパターンのおさらいからやっていきます。

Game Programming Patternsをひもとく

再読しようしようと思いつつ「まだそのときではない」と放置している『Game Programming Patterns』を本棚から引っ張り出してきました。
Observerパターンの要約として「オブジェクト間に一対多の依存関係を定義する。これにより、あるオブジェクトが状態を変えたときに、依存関係にあるすべてのオブジェクトに自動的にその変化が知らされ、必要な更新が行われるようにする」とあります。
MVCアーキテクチャと言えばObserverパターンらしいですよ。

で、Observerパターンってなに

例えば「敵の攻撃を合計で100回避けたとき」に何かしらの報酬をプレイヤーに与えたいとします。
この「避けたとき」の処理に「回数をカウントするロジック」と「合計で100回避けたときに報酬を与える処理」を組み込んでもひとまずは目的が達成できると思います。
ただこの「避けたとき」に音を鳴らしたり、エフェクトを発生させたり、プレイヤーの何らかのゲージを回復させたり……などなどの処理を組み込むと、一つの処理が肥大化してしまいます。
それは複雑度が増すので避けたいですよね。変更が難しくなります。
そこでObserverパターンです。
今回の場合だと「避けたとき」を監視し、避けたなら「今避けましたよ!」と他のオブジェクトに伝達する機能を持ちます。
そうすると、伝達されたクラスがそれぞれで「避けた回数をカウントする」「音を鳴らす」「エフェクトを発生させる」「合計で100回避けたときに報酬を与える」などなどを別々に組み込むことができるようになります。
これは素晴らしい!

C#だと

上記のObserverパターンですが、C#だとこのパターンを実装するためにeventというものが組み込まれています。
なので僕はObserverパターンを自作したことがありません。
今回はこれを自分で実装してみようと、そういうわけなんですね。

作ってみる

というわけで本をシコシコ眺めながら作ってみました。
ひとまずObserverとSubjectの基本形をドン。

以上のクラスを用意した上で、以下のクラスを適当なGameObjectにアタッチします。
すると左クリックしたとき、登録したObserverに「あいうえお」という文字が通知されます。
Zキーを押すと「Zキー押されたよ」ですね。

ここまでではまだ通知される側を何も用意していないので、ボタンをクリックするとObserverを登録する機能を持つクラスを作成してみます。

これでボタンをクリックすると「あいうえお」と「あいうえおあいうえお」と表示されます。
このままだと「だからどうしてんボケ」と言われそうなので、uGUIと連携してみたいと思います。

このクラスはuGUIのTextに貼り付けてください。
ゲーム開始時、自分自身をSubjectに登録しています。
そして通知が来たら、uGUIのテキストを変更するようにしています。
右クリックなら「あいうえお」で、Zキーを押したなら「Zキー押されたよ」ですね。

注*真似する人はまずいないと思いますが、作りがかなり雑なので上記のコードをコピペして使用するのはやめてください。

Observerパターンを作ってみて

改めてObserverパターンを作ってみてわかったことですが、自分が全然このパターンを理解していなかったとわかりましたw
今もあやふやな部分が多々あります。
これはUniRxの理解が困難なわけですねえ……。

終わりに

とりあえず作ってみただけなので、もう少しObserverパターンについて勉強してみようと思いますよ。
ほなそんな感じでまた。

フォローする