静寂とプログラミング

技術について書いたり、日常について書いたり

HololensでUniRxを使おうとしたらビルドできなかった話

概要

Hololensアプリケーションを作成するときは、一度WSAでビルドしてVisual StudioからHololensにデプロイする必要がある。しかし、UnityでWSAにプラットフォームを変更して、VisualStudioにビルドしようとした時に怒られた。

参考

Unity+UniRxでUWP対応のWSA(Windows Store App)を開発するときの備忘録 - プログラミングで世界を変える
【Unity】Windows Store AppでUniRxのIObservableを使う - vaguely
Unity 2017で.NET4.6選択時にVisual Studio上で出るエラーを消す方法 - Qiita
今どきの HoloLens 開発環境ってどうすればいんですか! – ギャップロ

怒られた内容

主に3つエラーが出ました。
・UniRx.IObserver<TValue, TResult>' require '2' type argument(s)
・IObservable could not be found. Are you missing an assembly reference?
・IProgress could not be found. Are you missing an assembly reference?

の三つでした。予想としては、ビルドのプラットフォームのスイッチをした時に生じることから、ビルドのディレクティブの部分でややこしいことになっている気がしました。また参考にさせていただいた記事の操作をしても変わらなかったので、自分で対処することに。

結局、僕の環境ではWSAにビルド設定した時の.NetにIObservableがないよと言ってるだけっぽいので、BuildSettingsから.Netのバージョンを.Net3.xから.Net 4.xに上げることを考えました。

やったことと結果

やったこと

Build Settings > Other Setting > CofigurationのScript Runtime Versionを
.Net 3.5からExperimental(.Net 4.6 Equivalent)に変更した。

結果

Unity上のBuildが通って、hololens上でもビルドが通って正しくアプリが起動することを確認できました。

UniRx実装する時に使えるTips集

自分がUniRxで実装する時に調べたことや、有用な記事を項目別に分けてまとめていきます。 それぞれの記事について自分の読んだ感想を書いているので、参考になると幸いです。 随時更新していく予定です。

UniRx入門

まずはそれぞれの機能について知る必要がある。以下の記事を読めば、大体のUniRxの 機能を知ることができる。(理解できるとは言ってない)

UniRx入門 その1 - Qiita

UniRxの中核機能であるSubjectを主に説明している。Subject周りについてしっかり書かれていて 良いが、今まで他の言語を含めRxで書いたことのない人にとっては少々読むのは辛いかもしれない。

UniRx入門 その2 - メッセージの種類/ストリームの寿命 - Qiita

3つのメッセージのOnNext, OnError, OnCompleted
・OnNext:
・OnError:
・OnCompleted:
ストリームを正しく破棄しなければ、メモリリークを起こして、パフォーマンスを低下させる
・AddTo(gameObject):を書くことで、指定のGameObjectが破棄された時に自動的にDisposeを呼び出せば良い

UniRx入門 その3 -ストリームソースの作り方 - Qiita

ストリームソースの作り方

Subjectシリーズ

ReactivePropertyシリーズ

・ReactivePropertyはインスペクタービューに表示することが可能。MV(R)Pで真価を発揮するらしい。

ReactiveCollection

・状態の変化を通知する機能が内蔵されたListである。

ReactiveDictionary<T1, T2>

・ReactiveCollectionとほぼ同じ挙動

ファクトリメソッドシリーズ

・Subjectだけでは表現できないようなストリームを簡単に作るできる場合があるらしい。

  • Observable.Create

  • Observable.Start
    非同期で何か処理を走らせて、結果が出たら通知して欲しい時に利用することができる。

  • Observable.Timer / TimerFrame

UniRx.Triggersシリーズ

UniRxで一番重要かつ便利とのこと UnityのコールバックイベントをUniRxのIObservableに変換してくれる。

こルーチンから変換する

オペレーションチェーンで複雑なストリームを作るより、コルーチンと併用して手続き的に書いた方が 良い場合があるので、覚えておいて損はない。

uGUIイベントから変換する

実装するときの注意すること Tips

ReactivePorpertyについて

ReactivePropertyはSubjectの機能を使いやすくしたものと思っています。

UniRxを使ってゲームの進行を管理する手法 – ニムサイト

UniRxでMVP設計する

MVPで設計する時に参考になる書き方を紹介してくれている記事。
Web出身のUnityエンジニアによる大規模ゲームの基盤設計

PresenterとView間のやりとり

Presenter -> View
・View内では、Viewに関するプロパティを直接参照できないように、privateで宣言する。
・privateで宣言したものをpublicプロパティでgetterとして返す。
・ActionをPublicで宣言して、Presenter側でそれをPresenter側で処理内容を記述する。

PresenterとModel間のやりとり

Presenter -> Model
・Model側にPublic関数を用意してPresenterでそれを呼び出すようにする。
Model -> Presenter
・Model側にIReadOnlyReactivePropertyを公開プロパティとして用意してそれをPresenterで呼び出すようにする。

UniRxで書くときの原則

リアクティブスパゲティを避けるための2つの原則 │ Aiming 開発者ブログ

マイクロフォンアレイと用いた音源定位・分離ーメモ

マイクロフォンアレイと用いた音源定位・分離

複数のマイクロフォンを使うことによって、雑音かでも音源の方向を推定(音源定位)を推定することができる。また、特定の方向から到来する怨念のみを分離抽出することができる。

ビームフォーミングの基礎

複数のマイクロフォンアレイを使うことによって、任意の方向にソフトウェア的に指向性を作り出すことができる。 1. 音源定位:各方向に順番にビームを向けた結果、得られる出力が大きい方向に音源があるとして、音源方向を推定する。 2. 音源方向にビームを形成して、その方向から到来する音源信号が多く含まれているので、これを分離抽出した音源信号とする。

マイクロフォンアレイの配置を最適にすることがマイクロフォンアレイの数を減らすことは可能になるのか

Hololens上で動画録画、保存、リアルタイム表示

Hololens-動画録画、保存、リアルタイム表示

Hololens上で動画を撮影して、保存する方法がわからなかったので、メモ。 動画を単に撮影して保存や、PC上にリアルタイムに表示したいだけなら(画像処理とかしたいわけではなく)以下の記事が参考になった。

cheat.co.jp

上のURLのHololensで見えているMR映像を見てみよう!で説明されている通り、DevicePortalを開き、Views > Mixed Reality Captureから動画を録画、再生、保存をすることができる。Live previewで動画をリアルタイムにhololens上の映像を見ることができる(3秒ほどの遅延がある)。

大津の2値化ークラス間分散がよくわからない

大津の2値化は画像を自動的に最適な閾値を決定し2値化するアルゴリズムです。

直感的な理解として、クラス内の分散は小さいほどよく、クラス間の分散は大きいほど良いとして分離度を定義しています。

分離度 \displaystyle X = \frac{S_b^{2}}{S_w^{2}}

クラス内分散  \displaystyle S_w^{2}=\frac{n_0 \sigma_0^{2} + n_1 \sigma_1^{2}}{n_0 + n_1}

クラス間分散  \displaystyle S_b^{2}=\frac{n_0(\mu_0 - \mu)^{2} + + n_1(\mu_1 - \mu)^{2} }{n_0 + n_1}

この分離度定義するときに、クラス間分散というものがあるのですが、このクラス間分散が数式的にどう理解をすれば良いのかが わかりません。