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で書くときの原則
マイクロフォンアレイと用いた音源定位・分離ーメモ
マイクロフォンアレイと用いた音源定位・分離
複数のマイクロフォンを使うことによって、雑音かでも音源の方向を推定(音源定位)を推定することができる。また、特定の方向から到来する怨念のみを分離抽出することができる。
ビームフォーミングの基礎
複数のマイクロフォンアレイを使うことによって、任意の方向にソフトウェア的に指向性を作り出すことができる。 1. 音源定位:各方向に順番にビームを向けた結果、得られる出力が大きい方向に音源があるとして、音源方向を推定する。 2. 音源方向にビームを形成して、その方向から到来する音源信号が多く含まれているので、これを分離抽出した音源信号とする。
マイクロフォンアレイの配置を最適にすることがマイクロフォンアレイの数を減らすことは可能になるのか
Hololens上で動画録画、保存、リアルタイム表示
Hololens-動画録画、保存、リアルタイム表示
Hololens上で動画を撮影して、保存する方法がわからなかったので、メモ。 動画を単に撮影して保存や、PC上にリアルタイムに表示したいだけなら(画像処理とかしたいわけではなく)以下の記事が参考になった。
上のURLのHololensで見えているMR映像を見てみよう!で説明されている通り、DevicePortalを開き、Views > Mixed Reality Captureから動画を録画、再生、保存をすることができる。Live previewで動画をリアルタイムにhololens上の映像を見ることができる(3秒ほどの遅延がある)。