RE:ADV

UnityでADVを作るブログ

「Introduction to Rx」 の2章の冒頭だけなんとなく訳してみた

Introduction to Rx
こちらのページにRxの解説があるよって @neuecc 御大が書いていたので↓
neue cc - A Beginners Guide to Reactive Extensions with UniRx
なんとなく読んでいたのですが、まあ、さっぱりわからないんですね。

ただこちらのお仕事と

Reactive extensions入門v0.1

とりすーぷさん。

Unity - UniRx/同時に画面に写ったオブジェクトの数を数えてみる - Qiita

ネットに散らばる先導者をフォローしていたら、さすがに少し理解してきました。

そんな中、訳したらなんか役に立つかな、と思って上↑のIntroduction to Rxをちょっと日本語にしてみました。
確実に訳が間違ってる文があると思うのですが、まあ、こんなことが書いてあるんだー的な。

実際のメソッドの解説に入ったら、上のかずきさんの仕事でいいじゃないか、と気づいてそこまででやめたからほぼ意味ないのですが、個人的にはなにかしら整理できた感あり。

何事も入り方が大事だし、繰り返せる形式ってあるよね、、、ていう。

Introduction to Rx

PART2-Sequence basics

さて、Rxを用いて何かコードを書いてみたいところだろう。しかし、どこから始めたらいいだろう。わたしたちはすでに鍵となる型(key types)を見たが、自ら基礎的な道具であるIObserverやIObservableを作る必要はなく、subjectsを用いてファクトリーメソッドに働きかける方がいい。ただし、オブザーバブル・シークエンス(observavle sequence)を持っていたとしても、どうやってそこからわたしたちは目的のデータを取り出せるのか。わたしたちはオブザーバブル・シークエンスを作る基礎や、そこに値を流し込むこと、また、目的のバリューをそこからピックアップするといったことを理解する必要がある。

パート2では、オブザーバブル・シークエンスの構築とクエリの基礎を見ていく。LINQが鍵になる。より深い探求によって、ファンクショナル・プログラミングのコンセプトはその核にLINQの理解を伴っていて、そこではじめてRxはマスター可能なものになることをわたしたちは発見するだろう。わたしたちはクエリを三つのグループに分類する。それぞれのグループはそこから他のオペレイターが派生しているようなルート・オペレイターを持っている。このような分解作業はRxやクエリ・コンポジション、ファンクショナル・プログラミングに対する深い見通しを与えてくれるだけでなく、Rxの用意されたメソッドがあなたの必要に合わなかった場合に、目的に合ったカスタム・オペレイターをあなた自身が作れるようになるという目的に適っているだろう。

Creating a sequence

前のチャプターで、わたしたちは最初の拡張メソッドとしてSubscribeとそのオーバーロードを見た。また最初のファクトリー・メソッドとしてSubject.Create()を使用した。RxをRxたらしめているIObservableを豊かにする非常にたくさんのメソッド群を見ていこう。パプリック・インスタンスメソッドが割合に少ないことに驚かれるかもしれない。しかしそこには多くのパブリック・スタティック・メソッドがあり、またより特徴的なことには、非常に多くの拡張メソッドがある。あまりに多くのメソッドとそのオーバーロードがあるために、わたしたちはそれらをいくつかのカテゴリーに落とし込んで理解する必要がある。

※ある種の読み手はここから先の数チャプターはスキップできると考えるかもしれない。もしあなたがまさにLINQやファンクショナル・コンポジションに精通していると考えているなら、わたしはこう指摘するにとどめる。この本の意図するところは、Rx入門をまさにステップバイステップで行うことにあるのであり、読み手としてのあなたが、自身のプログラム(ソフトウェア)でRxを使えるようにすることにある。Rxを内蔵したアプリケーションはRxの基礎を適切に理解することで生まれる。Rxについて人々がおかすありがちな間違いは、Rxをビルトする原則に対する思い違いに起因している。それだけ心に留めてもらえたなら、どんどん読み進めていってほしい。

簡単なインスタンスサブジェクトを作成したときに見たkey typesの調査から始めるのが適切なように思える。最初のカテゴリーは、簡単にObservableインスタンスを作成する方法を与えてくれる[creational methods]だ。これらのメソッドは一般的に、単純に型付けされた値もしくは型そのもののシークエンスを生み出す種を保持する。(関数型プログラミングではこのことをその展開(unfold)機能に着目してアナモーフィズムと呼んでいる。)

Simple factory methods

observable.Return
*1

*1:以下メソッドの説明

プログラミング生放送勉強会 第32回@GMO Yours から学んでみた

今日は、昨日行われた

を見ながらUnityの勉強をします。

赤坂玲音氏の発表から
ユニティのコーディング手法いろいろ

  • publicでフィールドを公開しない!


僕自身がプログラミング超初心者なので、そういう視点で進めていきますが(以下、間違ってる可能性があります(キリ)、

public float Value{ get { return _value; } }

↑この書き方はプロパティと呼ばれるもので、とても重要な文法のひとつです。

プライベートな

_value

というフィールドに
パブリックで公開された

Value

(↑先頭が大文字!)というプロパティをゲッターとして設定しています。

イメージとしてはブラックボックス(プライベートなフィールド)に出力用端子をつけまーす、と宣言している感じです。

出力がゲッター(get)で、入力がセッター(set)ですね。
セッターはプライベートにしてしまって自分のクラスからしかアクセスできないとかやります。
プロパティというのはフィールドに値を入れたり出したりするときに関数を実行するものらしいので、ここを工夫するといろんな仕組みが実現できる感じです。

[SerializeField]

これはアトリビュート(属性)というもので、フィールドやメソッドの前につけると機能を発揮します。
Unityの場合、シリアライズフィールド属性をつけるとエディター上のインスペクターに公開されるというわけですね。
同じ機能を持つパブリックなフィールドより良いよ、と。僕はいままで全部publicで公開してたので(安直)、これからはSerializeFieldを使いたいですね。

  • 遅延初期化する

わかんない感じの技術が出ました。

どうやら、ゲームオブジェクトをインスタンシエイトしたとき、Awake()やStart()といったユニティが用意してくれているメソッドでの初期化には問題があるので、それを避けつつ、記法としてもよいのでは(フィールドと初期化処理が一カ所にまとまるので)、ということのようです。
コードは

こう…かな。
上記のコードを用いて、Start()メソッド等でインスタンシエイトしたオブジェクトを初期化するといいよ、と。(ここら辺の細かい手順は動画で要確認です。)

  • 静的に参照する
  • 文字列定数の代わりに列挙型を使う

すごくいい感じの決まりなんで、ぜひ使っていきたいと思いました。

  • アニメーターをラップしたクラスを作る

ユニティのプレイヤーの挙動もこういうラップがしてあったと思います。それを自作して挟んでおくパターンが有効。

  • Update()の処理をコルーチン(Coroutine)化する

えっ!て思った話。でも常識みたいでした。
アップデートには何も記述しなくてもいける、その方がロジックが破綻しない!
いわゆるステートパターン(の直書き)否定なんですね。

→これを「宣言的に書く」と表現できるようです。

フラグ管理をしなくてよくなる…。素晴らしい!でもまだよく理解できない!
次に話をされたとりすーぷ氏も同じ話をされていたので、よゆーでできる技術のようなんですが。

やってみたいですね。動作(M/Model)/操作(条件づけられて変化する・C/Controller)を分けてコーディング。それらをインターフェイスで抽象化しておく!

以上の赤坂玲音(Leon Akasawa)氏のサンプルコードは

でダウンロードできます!