ニートが学ぶUniRx ツクールMVでRx

はいどーもニートです。
みなさんリアクティブってますか。
僕は雰囲気でリアクティブってます。

というわけで本日はツクールMVでリアクティブプログラミングをおこないたいと思います。
UniRxとか書いてますが、使うのはRxJSです。

とりあえず使ってみる

適当にRxJSを落としてきて、プラグインとして導入してください。
それから新規プラグインをこれまた適当に作り、以下のように書きます。

歩くたびにイベントを発生させています。
そのイベントは歩数を渡してくれます。
で、マップシーン開始時に「5歩ごとにメッセージを表示」するイベントと「10歩以上歩いているなら一度だけリカバリー音を鳴らす」というイベントを登録しています(めっちゃうざいですね)。

これをRx(やイベント)を使わずに実装すると、stepSubject.next(this.steps());を呼んでいる箇所で「5歩ごとにメセージを表示する処理」と「10歩以上歩いているなら一度だけリカバリー音を鳴らす」処理を組み込まなければならず、他にも追加したい機能が増えるたび、一つの関数が複雑になります。
また、通常のイベントと違って、初期化時に宣言的に条件を書けるので纏まっていいらしいです知らんけど。
いやあわかりやすい(たぶんきっと)。

問題点

この作りだと、シーンが表示されるたび何回もSubscribeされます。
また、即時関数で囲っていますが、即時関数内ならstepSubjectがどこからでも参照可能なのも問題ですね(こうしているのは、Game系のクラスにクラス構文を使ったインスタンスを保存すると、特殊な方法を取らなければセーブデータが正常に保存されないためです)。これはうまい方法がなんかありそうですね。
また、Subjectを破棄するタイミングを考えるのが面倒だったので、マップシーン表示のたびに新しいRx.Subjectを生成しています。たぶんGCがうまく破棄してくれるはず。

ツクールでRxを使うと何が嬉しいのか

わかりませんw
ぶっちゃけオブジェクトのライフサイクル管理が面倒くさすぎて、あんまり恩恵ないかも
UniRxで言うReactivePropertyが利用できたらもっと色々できると思うのですが……どうもReactivePropertyはUniRx独自のもののようでした。
あとは僕がもっとRxに慣れたら何か発見があるかもしれませんね……。

終わりに

思い立ったので試してみましたが、ぶっちゃけ想像以上に使いにくかったです。
これツクールMVだとどういう風に使うといいんですかねえ……。
ググっても誰も使ってないっぽい感じ、あまり有用な使い方がないんですかね……。

ほなそんな感じでまた。

おまけ

Rxと言えばダブルクリックらしいので、ダブルクリックで反応するストリームを作成してみました。

フォローする