やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

『ソフトウェア品質を高める開発者テスト アジャイル時代の実践的・効率的なテストのやり方』レビュー

昨日発売された『ソフトウェア品質を高める開発者テスト アジャイル時代の実践的・効率的なテストのやり方』、ざっくりと読んだので簡単にレビューします。

対象読者

まず対象読者について。タイトルにある「開発者テスト」や「ユニットテスト」というものを実践している方はもちろん、言葉は知っていて良いテストを書きたいを思っている方などには 向きません *1

そうではなく、旧来の、開発の後工程としてテストを実施し、バグを潰しきれずに疲弊している組織の方におすすめしたい書籍です。

早期工程でのバグ検出・品質作り込み(本書では「上流品質向上」と表現)、ユニットテストリファクタリング、CI(継続的インテグレーション)といったモダンな開発手法に馴染みのない方にとって、一通りの知識をこの一冊でざっくり得られるはずです。

おすすめできる点

  • はじめにモチベーションとして、上流品質向上やShift Leftの効果についてしっかり語られている
  • コードカバレッジについて、ステートメントカバレッジ (C0) とブランチカバレッジ (C1) の違いについて詳しく書かれている
  • サイクロマティック複雑度(本書では単に「複雑度」や「McCabe数」と表現)について、詳しく書かれている
  • Googleのバグ予測(修正回数の多いファイルはバグ混入率が高い)に触れられている
  • テストケースを作るためのテスト技法について触れられている(ただし境界値テストと状態遷移テストのみ。これを目的にするのであれば後述する別書籍をおすすめします)
  • システムテストなど後工程のテストにも言及、全体を俯瞰できるはず
  • Android Studioを使ったユニットテスト、コードカバレッジ採取、Circle CIによるCIなど、実践的なサンプルやスクリーンショット(ただし巻末の1割程度のボリューム)

おすすめできない点

  • 用語が独自なので、この書籍を読んだ次のステップで調べたり、他のテストエンジニアと交流する段階でギャップが出そう。本書を読んだ後、 JSTQB認定テスト技術者資格-シラバス(学習事項)・用語集- などを参照してテスト用語の認識を合わせたほうがよさそうです *2 *3
  • リファクタリングの根拠がファイルの大きさとサイクロマティック複雑度のみなので、もう少し内部品質やSOLID原則あたりに言及してほしかった
  • 「7.5 出口は1つ」は鵜呑みにしてほしくない。サイクロマティック複雑度を根拠にしているので仕方ないが、関数/メソッドから早期リターンすることはネストを下げて可読性向上につながるので

テスト技法についてのおすすめ資料・書籍

ユニットテストを書く開発者が、テストケースを作るために参考となる「テスト技法」についての資料・書籍を紹介します。

JaSST'21 Tokyoでの河野哲也さんのセッション資料。ユニットテストで使える「同値分割」「デシジョンテーブル」「状態遷移図」が例題とともに紹介されています。

www.slideshare.net

こちらも各テスト技法を解説している書籍です。

各テスト技法の事例・問題集。

所感

書籍などでユニットテストについて紹介するとき、テストケースを作るためのテスト技法は省略されがちです*4。 しかし、開発者もテストを書くならば持つべきスキルだと考えており、その点で本書のように開発者テストとテスト技法を結びつける書籍に期待していました。

本書は残念ながら方向性の異なるものでしたが、「開発者テスト」の概念を知らない方に向けて、薄く広く、俯瞰して理解できる書籍ですので、最初の一冊としてはおすすめできそうです。

*1:内容が悪いという意味ではなく、タイトルがミスリードなのでは感

*2:ISTQB/JSTQBが絶対ということではないのですが

*3:私が「単体テスト」でなく「ユニットテスト」という言葉を使うのは、「単体テスト」が人によって様々なバリエーションを持っているため無用な混乱を避けるためです。この点、本書p.34でも言及されていながら「単体テスト」の語を使っていたりする

*4:自著『iOSアプリテスト自動化入門』では、同値クラス、境界値テスト、デシジョンテーブルについては紹介していましたが

ML-Agentsに入門するならUnity LearnのML-Agents: Penguinsがおすすめ

個人差があるとは思いますが、最初のチュートリアルとして良いサイズだと思うので(そしてUnity Learnの検索で出てこないので)紹介します。

おすすめポイントは、

  • ダウンロードするファイルはペンギン等のfbxのみ
  • コードは説明付きで小分けに提示されていて、コピペするにしても内容を把握しながらできる*1
  • 学習用Python環境のセットアップも解説されている(Anacondaを使用)

なお、Unity Learnは無料で提供されています。

ML-Agents: Penguins

learn.unity.com

このコンテンツ、内容が古いためかUnity Learnの検索で出てきません。 Unity ML-Agents Toolkitは2020年5月に晴れてバージョン1.0がリリースされ、最新版はRelease 12です*2*3。 一方、このPenguinsチュートリアルはBeta 0.13をベースとしています。

そのため、上記ページそのままではなく、チュートリアルを提供しているImmersive Limit LLCが別に公開しているアップデート情報*4を元に進めます。

www.immersivelimit.com

以下、個人的な補足です。

  • Unity packageはUPM、Python packageはpipで取得できるため、Unity ML-Agents Toolkit リポジトリのclone取得は不要です*5
  • UnityのPackage Managerウィンドウでは ML-Agents 1.0.6 (verified) までしか出ませんが、Packages/manifest.jsonを直接編集すれば 1.7.2-preview も指定できます
  • Anacondaは必須ではありません。ただし何かしらのPythonパッケージ+環境管理ソリューション*6は使ったほうがよさそう
  • Anacondaで環境を作るとき、名前は ml-agents より、Python packageのバージョンを加えて ml-agents-0.23 などとするのがよさそう
  • gitリポジトリで管理するとき、ML-Agentsの生成するファイルは.gitignoreに下記を追加することでトラッキング対象外にできます
Assets/ML-Agents*
results/

自分で学習させたペンギンが動くのはかわいくて、ずっと見てても飽きないですね。

f:id:nowsprinting:20210223225822p:plain

その他のUnity Learnコンテンツについて

Karting Mod:スマートカートのトレーニングガイド

learn.unity.com

日本語対応しているものですが、以下の理由で最初にはおすすめしません。

  • Penguins同様 0.13 ベースで古い(ML-Agentsはプロジェクトに内包しているので動かしてみるだけなら問題はない)
  • Penguinsに比べて要素が多い

ML-Agents: Hummingbirds

learn.unity.com

こちらはバージョン1.0 (Release 1) 時点でのコンテンツです。 動画による前提の説明もあり、「強化学習なんもわからん」人にはこちらから入ってもいいかもしれません。

ただ、説明がほとんど動画で時間もかかるので途中までで止めてしまいました。 続きを進めたらこの記事を更新するつもりです。

参考

Unity ML-Agents Toolkit に入ってるexamplesの解説

ml-agents/Learning-Environment-Examples.md at release_12_docs · Unity-Technologies/ml-agents · GitHub

Unity ML-Agents Toolkit のマイグレーション情報

ml-agents/Migrating.md at master · Unity-Technologies/ml-agents · GitHub

ML Agents 1.0以降に入った変更などの話

blogs.unity3d.com

*1:完成プロジェクトで説明される場合、どこまでML Agentsでどこから自作した機能なのかわからないことが起こりがち

*2:Unity packageとPython packageで別々のバージョンが振られているためこの表現。ちなみにRelease 12のUnity packageは1.7.2、Python packageは0.23.0

*3:これを書いた2日後にRelease 13が出ました

*4:ML-Agents Release 10 向けアップデートとなっていますが、Release 12でもそのまま動きました

*5:多数のExamplesがあるので次のステップとして触ってみるには良いと思います

*6:Minicondaとかvenvとか

#cluster 勉強会・イベント登壇Tips

yokohama.unity をはじめ、オンライン勉強会の会場として cluster が使われることも珍しくなくなりました。 つまり、clusterで登壇する機会も増えているということです。

clusterでの登壇には、リアル会場やZoomなどWeb会議サービスとは異なる特性があります。 本記事では主に、はじめてclusterで登壇する方向けのTipsをまとめます。

f:id:nowsprinting:20210126001157p:plain

機材の準備

PC

clusterのイベントにはスマートフォン (iOS, Android) でも参加できますが、スライドや動画の再生操作を行なうためにはPC (Windows, Mac) からのログインが必要です。

もちろん、スライド操作を誰かに代行してもらって自分はスマートフォンで話すという選択肢もあります。どうしてもPCが使えない場合など、主催者に相談してみてもいいでしょう。

ヘッドホン / イヤホン

音声のループバック対策は重要です。 ループバックは、スピーカーから出た音をマイクが拾ってしまうことで再びスピーカーから同じ音声が(遅延して)出力されてしまう現象です。 Zoomではサービス側でノイズリダクションが効いているのでノートPC内蔵のスピーカーとマイクでも大丈夫ですが、clusterではこの機能が弱いため、あらかじめユーザ側で対策しておく必要があります。

具体的には、ヘッドホンやイヤホンを使うことで、clusterからの音声出力がマイクに入らないようにする対策が効果的です。

スマートフォンに同梱されているイヤホンで十分ですが、Bluetooth接続やノイズキャンセリングなどあれば快適さは増します。 あえておすすめと言われるとこれですね。

Apple AirPods Pro

Apple AirPods Pro

  • 発売日: 2019/10/30
  • メディア: エレクトロニクス

もしくは、Krispのようなノイズリダクションできるソフトウェアを導入する方法もあります。

krisp.ai

マイク(任意)

環境音やエコーを防ぐため、外付けのマイクの使用が望ましいです。 指向性のあるコンデンサマイク(数千円のもので十分)で自分の声のみ拾うようにするだけで、ハウリングやタイプ音が軽減できます*1

私が使っているのはこれ。

VRヘッドセット(任意)

これは任意ですが、VRヘッドセットを使ってVR登壇する体験はおすすめです。デスクトップに比べ、以下のメリットがあります。

  • 見回しやすい:オーディエンスの反応と投影されているスライドを交互に見ることも簡単です*2
  • 指し棒が使いやすい:会場によっては指し棒が用意されています。デスクトップ版でも手に持って指すことはできますが、VRのほうが断然、扱いやすいです
  • 細かいリアクション:デスクトップでは移動でしかアバターが動きませんが、VR登壇であれば身振り手振りを交えたプレゼンテーションが可能です(意識して動かすのでなく、自然な動きがアバターにも反映される)
  • 会場のギミックで遊べる:会場によってはギミックやアイテムが転がっていたりします。デスクトップでも遊べますが、VRのほうが楽しいです

PC向けVRヘッドセットは色々と出ていますが、今なら(PCのグラボが要件を満たしているならば)Oculus Quest 2をUSBケーブルで接続して使う (Oculus Link) のがおすすめです*3

support.oculus.com

なお、オーディエンスとして参加する場合はPCデスクトップのほうがキーボードでコメントを打てるので楽しいと思います。

プレゼンテーション資料

スライドはpdf、動画はmp4形式で準備し、あらかじめclusterにアップロードしておきます。

会場のスクリーン比率はほとんど16:9ですが、一部4:3やオリジナルな比率である可能性もあります。念のため主催者に確認することをおすすめします。

文字サイズは、リアル会場で投影するものと同じ感覚で作るのが良さそうです。 ただ、リアル会場と異なり、見づらい場合は自由に前に来て見ればいいわけなので、遠くからでも読める必要はありません。

また、スライドの途中に動画を挟む場合、pdfファイルは動画の前と後ろで分割しておくことをおすすめします。 ファイルを切り替えたときにスライドのページが先頭に戻ってしまいますので、動画再生後スムーズに続きのスライドを表示できるようにしておきます。

ファイルサイズ上限は下記ページを参照してください。

アップロードできるファイルとサイズ上限 – ヘルプセンター | cluster(クラスター)

アバター(任意)

clusterのイベントでは 「スタッフ」に割り当てられていると独自アバターを使うことができます。 ほとんどのイベントでは登壇者は「スタッフ」になるはずですが、アバターが使えない「ゲスト」を割り当てるケースも考えられます。事前に主催者に確認することをおすすめします。 2021年3月26日より、イベント参加者全員が独自アバターを使用できるようになりました。

アバター使用は任意ですが、SNSアイコンのようにオーディエンスに印象づける効果が見込めます。

アバターは、主に以下いずれかの方法で用意できます。

1. REALITYアバターをコンバート

REALITY の自分のアバターをclusterに持ち込めます。カスタマイズ幅は限定されてしまいますが、もっともお手軽な方法です。

コンバート手順は下記記事を参照してください。

note.com

2. VRoid Studio

VRoid Studio を使ってオリジナルのアバターを作り、VRM形式にエクスポートしてclusterにアップロードします。 BOOTH などでVRoid対応の服テクスチャやアクセサリなども販売されており、独自のアバターを作りたいのであればこれが最有力です。

なお、cluster準拠のVRMにするためにエクスポート時にリダクションする必要があります。概ね、

  • マテリアル数: 8
  • テクスチャ解像度: 2048x2048

に設定してエクスポートすれば大丈夫なはずです。

vroid.com

ただし、リッチなアバターになるとVRoid Studio標準のエクスポート機能だけではcluster準拠にまで落とせないケースもあります。 下記記事などを参考にリダクションしてみてください。

qiita.com

3. その他

BOOTH などでアバターを購入したり、自分でフルスクラッチしたモデルをUnityと UniVRM を使ってVRM形式にエクスポートしてclusterにアップロードします。

販売されているアバターには、あらかじめVRMファイルが同梱されているものもありますが、clusterにアップロードできる要件を満たしているとは限らないので注意してください。 自分でリダクションができない場合、cluster準拠と明記されていないVRMファイルは使えないと思ったほうが良いです。

詳しいスペックは下記ページを参照してください。

カスタムアバターの制限 – ヘルプセンター | cluster(クラスター)

会場の下見

イベント会場には「スタッフ」であれば開場前に入ることができます。 登壇慣れしていない場合など特に、事前に会場の様子、スクリーンのサイズやオーディエンスからの見え方などを確認しておくと良いでしょう。 手軽に下見できるのはclusterの良いところです*4

なお、デスクトップ版およびスマートフォンの場合、デフォルトで「三人称モード」がオンになっているためやや遠い視点になっています。これをオフにした一人称視点での見え方でプレゼンテーションは調整することをおすすめします。

当日

clusterクライアントは頻繁にアップデートされているため、「ログインしようとしたらアップデート待ち」ということもよく起こります。 時間に余裕を持ってログインするとよいでしょう。

登壇してみよう!

clusterイベントへの登壇は、リアル登壇と比べても、Zoom等による登壇と比べても*5、ハードルが低いです。ぜひ機会を見つけて登壇してみましょう!

ちょうど良いところに、たいへん「ユルい」ことで有名な yokohama.unity が募集しているようですよ?

meetup.unity3d.jp

トラブルシュート

まれに、会場に入っても他の参加者が見えないというトラブルがあります。再ログインしても解消しない場合、そもそものインターネット接続経路の問題である可能性があります。

clusterを利用するには、以下のポートが開放されている必要があります。
TCPポート:80, 443, 1883

他の人が表示されない・すぐに切断される(ポート設定) – ヘルプセンター | cluster(クラスター)

この問題がイベント当日に発覚しても、すぐ対処できることは稀でしょう。 登壇者向けの接続確認会が設けられているときは、極力イベント当日に接続する環境からログインして確認しましょう。

その他の参考記事

bibinbaleo.hatenablog.com

www.crossroad-tech.com

*1:タイピングするわけではないので(clusterではライブコーディングはできないので)必須とまでは言いませんが、部屋の壁の反響などもあるのでやはり音声品質には影響します

*2:投影しているスライドは別ウィンドウで表示されるのですが解像度低いので実際に投影されているものを見たくなります。会場によっては返しのモニターが設置されていることもあります

*3:Oculus Quest 2のマイクはかなり音を拾うので、イヤホンを使いましょう

*4:リアルイベントだとなかなか下見できる機会がない

*5:オーディエンスの反応が見えない状態でプレゼンするのはとてもつらいです

UPMパッケージをunitypackage形式で配布する

Unityのエディタ拡張などは Unity Package Manager (UPM) で配布するのが便利です。 UPMのメリットとしては以下の点が挙げられます。

  • バージョン管理、アップデートが容易
  • 依存関係を設定できるため、依存先もUPMであれば同梱・再配布を回避できる
  • Assetsディレクトリ下を汚さない

しかし、Unity 2019.2より前のバージョンではPackage ManagerウィンドウでGit URLが指定できなかったり、scopedRegistriesの指定のために Packages/manifest.json ファイルを直接編集しなければならず、手軽に使ってもらうにはややハードルがあります。

また、VRChatユーザへの露出を考えると BOOTH からダウンロードできる形式での配布にはメリットがありそうです。

折衷案を探っていたところ、UPMパッケージをインポートしてくれるunitypackage形式のインストーラを生成してくれるサービスを見つけたので紹介します。

glitch-package-installer

前提として、配布するUPMパッケージは OpenUPM などどこかしらのレジストリに登録されている必要があります(Git URLではできません)。

インストーラの生成は、下記のようにAPIを実行します。

$ curl -o installer.unitypackage https://package-installer.glitch.me/v1/installer/OpenUPM/com.nowsprinting.blender-like-sceneview-hotkeys?registry=https%3A%2F%2Fpackage.openupm.com

すると、installer.unitypackageというファイルが生成されます。 このファイルをUnityエディタにインポートすると、OpenUPMから com.nowsprinting.blender-like-sceneview-hotkeys の最新バージョンがインポートされます。

なお、installer.unitypackageの中身は独自のインストーラであり、実際はこのインストーラが働いて Packages/manifest.json を編集したのち、インストーラ自身を削除するという振る舞いをしています。

f:id:nowsprinting:20210106090552p:plain:w400

UPMパッケージ自体のインポートは Packages/manifest.json に従ってUPMが行なうため、以降のアップデートは Package Manager ウィンドウで行なえます。

ちなみに、レジストリにOpenUPMを使っている場合、ページ右上にある "Get installer.unitypackage" ボタンでダウンロードできるものはこれと同じものです*1

APIの詳しい使い方はWebサイトを参照してください。

package-installer.glitch.me

ソースコードも公開されています。

github.com

補足

APIのサイトには、バージョン指定、スコープ指定の方法が書いてありますが、試したところ指定は反映されず、常にバージョンもスコープも指定なしのインストーラが生成されました*2

また、

should work fine from 2019.1 to 2020.2+.

とありますが、 Unity 2018.4.20f1 へのインストールができることは確認しています。

(1/7追記) 上記の通り、生成されるunitypackageにはUPMパッケージ本体のコードは含まれません。従ってコードのバックアップとしては用をなさないのでご注意ください。

*1:ダウンロードされるファイル名にはパッケージのバージョン番号がついていますが、常に最新版がインストールされます

*2:時間があるときにちゃんとコード読みたい…

Blender 的なテンキー操作で視点操作できる Unityエディタ拡張

Blender 的なテンキー操作で視点操作できる Unityエディタ拡張 Blender-like SceneView Hotkeys を公開しました。 Unity 2018.3 以降で動くので VRChat SDK 向けの作業にも使えます。

3Dモデリングツール Blender の 3D Viewport では、マウス操作のほか、テンキーによって視点などを操作できます。 使ってみるととても便利で手放せなくなったので、これを Unity のシーン・ビューでも使えるよう、エディタ拡張として移植したものです。

機能

v0.2 時点で実装している機能を紹介します。

以下、スクリーンショットのモデルには火村ユウヤ氏製作の 大神ルゥ さんを使用しています。

視点の方向

テンキー 1 で正面ビュー

f:id:nowsprinting:20200926185347p:plain:w400

テンキー 3 で側面(右)ビュー

f:id:nowsprinting:20200926185629p:plain:w400

テンキー 7 で上面ビュー

f:id:nowsprinting:20200926185642p:plain:w400

また、 control + 1 で背面、 control + 3 で左面、 control + 7 で下面からのビューになります。

透視投影/ 正投影 切り替え

テンキー 5 で透視投影 (perspective) と正投影 (orthographic もしくは isometric) が切り替わります。

f:id:nowsprinting:20200926190059p:plainf:id:nowsprinting:20200926190021p:plain

視点の回転

テンキー 8 2 4 6 で、上下左右に15°づつ軸を中心に視点を回転します。 また、 9 で現在の視点から180°回転した視点に切り替わります。

f:id:nowsprinting:20200926190357p:plain:w400

Roll

shift + テンキー 4 で左まわり、 6 で右まわりに、視点方向を軸に回転します。

f:id:nowsprinting:20200926185715p:plain:w400

Pan

control + テンキー 8 2 4 6 で、上下左右に視界を移動します。

f:id:nowsprinting:20200926190419p:plain:w400

Zoom

control + テンキー + でズームイン、 - でズームアウトします。

f:id:nowsprinting:20200926190433p:plain:w400

エディタ拡張のインポート方法

unitypackage ファイルからインポート

簡単なのは、 OpenUPM から installer.unitypackage をダウンロードしてインポートする方法です。

openupm.com

上のリンクを開き、ページ右の "Download installer.unitypackage" (下図の四角)をクリックします。

f:id:nowsprinting:20200926190459p:plain:w400

.unitypackage ファイルがダウンロードできますので、Unityエディタでプロジェクトを開いてインポートできます。

なお、通常の .unitypackage とは異なり、ファイルの実体は Assets フォルダ下には入らず、 Package Manager によって管理されます。 Window | Package Manager を開くと表示され、ここからアップデートも可能です。

(1/3追記) BOOTHにも.unitypackageをダウンロードできる商品(投げ銭用)を置きました。

ikagoya.booth.pm

その他の方法でインポート

その他、下記 GitHub リポジトリを直接 git URL として指定するなど、お好みの方法でインポートできます。

github.com

設定

テンキーを模倣 (Emulate Numpad)

お使いのキーボードにテンキーが無い場合、文字キー上部にある数字キーを使う設定が可能です。

Unity | Preferences ウィンドウを開いて "Blender-like SceneView Hotkeys" を選択、 "Emulate Numpad" を on にするだけです。 この設定は、UnityプロジェクトではなくPCごとに保持されます。

f:id:nowsprinting:20200926190522p:plain:w500

ただし、数字キーの 2 には別のホットキーが割り当てられています。 Unity 2019 以降であれば、ショートカットマネージャでこれを無効にするなどして競合を回避してご使用ください。

参考

Blender www.blender.org

Blender の 3Dビューポート操作マニュアル docs.blender.org

使用モデル booth.pm

#yokohamaunity in #cluster 会場ができるまで

昨晩開催された『yokohama.unity 実質4回目』会場として cluster のワールドを構築・提供しました。

meetup.unity3d.jp

ワールドは横浜の「大さん橋」屋上を 再現 模したもので、遠景に全天球画像、アーチ状の構造物などはフォトグラメトリで作ったハイポリモデルをリトポロジーしてローポリ化したものを配置。

f:id:nowsprinting:20200801042833p:plain:w400

少しでも横浜っぽさを感じ、楽しんでいただけたのであれば幸いです。

以下、製作の流れなどを紹介します。

会場の選定

前回(4/末)のオンライン開催の後、「横浜っぽい会場を作ろうか*1」ということで心当たりを何箇所かロケハンした結果、大さん橋に決まりました。

大さん橋は、みなとみらい*2ベイブリッジ山下公園といったスポットに囲まれており、まさに全天球写真向き。 ちなみに、大さん橋ホールは数多のビアフェスの会場になっていたりします。

遠景

全天球写真はRICOH THETA Sで撮影。ただし、撮影の主目的はフォトグラメトリ(後述)だったので、撮影に行くのはフォトグラメトリ日和つまり曇天。 7月に入って、そろそろ本番撮影をしなければと思うものの、ずっと天候悪く、曇天画像のまま当日を迎えました。

撮影した全天球画像は、@warapuriさんが公開されているライセンスフリーICO球 (Sphere100.fbx) の内側に貼り付けて使用しています。

UnityのSkyboxにそのまま貼って使うこともできましたが、撮影が雑で画像が大さん橋の中央でなく北に寄っていたため、うまく足元の構造物を隠せる上記方式をとりました。

構造物のモデリング

大さん橋屋上の構造物、大さん橋ホール入り口のアーチ(上のスクショでスクリーンの後ろにあるもの)と、南北にある階段状の客席をそれぞれフォトグラメトリ、リトポロジーして使用することを予定していました。

しかし残念ながら客席はリトポロジーが間に合わず、今回は単なる斜面に。

撮影

曇天*3の早朝、 iPhoneで動くマニュアルカメラアプリで、 北側客席は下側を東西に平行移動しながらヨーとピッチ変えつつ撮影。 エントランスも下側から南北に並行移動しながらヨーとピッチ変えつつ撮影。

南側に人がいたので北側を撮影したのですが、背景にランドマークタワーなどのビルが写ったためフォトグラメトリの像を結ぶのにプラスに働いたはず。

フォトグラメトリ処理に使う3DF Zephyr Liteにソース写真500枚制限があるため、客席とエントランスはあえて別々に撮影しています。

フォトグラメトリ

使用ソフトは3DF Zephyr Lite。2年前にSteamのセールで買ったものですが先日バージョン5にアップデートされました。最近は買い切り珍しくてお得感。

store.steampowered.com

北側客席は231枚中231枚が有効。設定はプリセットのカテゴリーを「市街地」、ほかはデフォルト。 奥のほうはエントランスの影があったこともあって暗く、そのせいか湾曲してしまっています。WBくらいオートにしてもよかったのかもしれません。 メッシュ生成の後、周囲のバリ取りを行なってテクスチャ付きメッシュを生成。

f:id:nowsprinting:20200801052744j:plain:w400

エントランスは54枚中53枚が有効。こちらもカテゴリー「市街地」、ほかはデフォルト。 こちらもバリ取りをしますが、出入り口正面の床は残し気味にし(後工程で水平を取りやすくするため)、客席部分は邪魔なので削ってしまいます。

f:id:nowsprinting:20200801052510j:plain:w400

加工したら、テクスチャ付きメッシュをobj形式で出力。fbxでも出力できますが、(恐らくLite版の制限で)テクスチャが出力できません。 テクスチャは後工程で捨ててしまうのですが、リトポロジーの際にテクスチャがあるほうが見やすいです。

なお、方向合わせは3DF Zephyrで無理に行わず、後からBlenderで行います。

スケールは、フォトグラメトリで作られたモデルの寸法を本当に信じていいのか未だ半信半疑。 今回は大きすぎると思って縮小して合わせたものの、終盤になって、どうも合っていたのかも? と…。

トポロジー

トポロジー (retopology) とは、フォトグラメトリやスカルプトで作られたハイポリモデルのメッシュの流れ(トポロジー)を組み直すこと。

自動でリトポロジーを行なってくれるツールもありますが、今回はcluster会場用にローポリモデルにしたいのでハイポリメッシュに沿って手作業で面を貼っていく作業をします。

今回はこちらの記事のワークフローに従い*4、販売されているBlenderアドオンを使用して貼っていきました。

bookyakuno.com

gumroad.com

エントランスのアーチ下側の部分。このようにハイポリメッシュに頂点を吸着させつつ面を貼っていきます。 ちなみにアーチ下の階段に横たわっている白と黒の物体は、寝ているおじさんです。

f:id:nowsprinting:20200801060603p:plain:w400

貼り終えたら、原点をホール入口中央の床面に合わせておきます。Unityでの位置合わせが楽なように、Blenderでやるのが一番良さそう。 その後、ローポリメッシュをUV展開してfbxエクスポート。Unityに取り込みます。

大さん橋屋上の床面

床面は、Blender大さん橋の平面図を下絵として取り込み、モデリングしていきます。 ここでも原点をホール入口中央の床面に、スケールはフォトグラメトリモデルから測定したものに合わせます。

f:id:nowsprinting:20200801060210p:plain:w400

実際はもっとカーブが多く、さらに南北でアシンメトリーなのですが、かなり単純化して面を貼っています。画像が南半分なのはミラーモディファイア使用のため。 平面図にあらわれないアップダウンは現地の記憶と写真で補いつつ進めます。

また、全天球画像の足元を見えなくするために、実際の床面より広く外に張り出しています(Unity上でコライダによって端まで行けないようにします)。

こちらもUV展開してfbxエクスポートします。本来は芝生部分の塗り分けがあるのですが、今回は一律、木目調のテクスチャをタイリング。

なお、当初、床面はUnity上でPro Builderで作りかけたのですが、大きなオブジェクトの位置合わせが大変で断念しました。 最終的にスタッフルーム(大さん橋ホール)の箱だけPro Builder製に。

小道具

小道具として、横浜のアイデンティティ(箱)をモデル化。 Cluster Creator KitのGrabbable Itemコンポーネントを入れて、持ったり投げたりできるように。みんな遊んでくれてよかった。

f:id:nowsprinting:20200801031042p:plain:w400

また、登壇者に cluster ゲームワールドコンテスト 2020 大賞受賞の@yunoda_3DCGさんがいらっしゃったので、急遽、大賞作『1min. Hockey』に飛べるWorld Gateを設置。

cluster.mu

所感

既知のノウハウのつなぎ合わせで作ったものなのですが、屋外の構造物をまともにフォトグラメトリ&リトポロジーするのははじめてで、色々勝手がわからず試行錯誤しました。

ここに挙げただけでも様々な妥協の産物なのですが、なんとか形にはなったかと。 今回妥協・見送りしたものは、次回yokohama.unity開催までに仕上げたいところ。

なお、大さん橋には撮影に関する規約があり、今回は個人撮影の範囲で利用しています。従って、イベントは限定公開、ワールド非公開、リポジトリも非公開となっています。ご了承願います。

参考

www.nowsprinting.com

*1:オフライン開催の頃から地域.unityのアイデンティティ確立は主催者が意識されていて、オンラインだとそれ無くなってしまうねという話が発端

*2:港町は海側が顔なので海から見るべき、という話があります

*3:多くの写真を撮っていくので、強い影が出ると時間経過で影が変わってしまうことを避けるため

*4:記事中でMatcap表示を勧められていますが、今回の作例ではフォトグラメトリで得られたテクスチャのほうがやりやすい

Unityプロジェクトのディレクトリ構成と .gitignore

Twitterで話題に上がっていたので、自分なりのやり方を。

ディレクトリ構成

Assets/下

自分で作るものはAssets/下にディレクトリ (Folder) を作り、そこにまとめています。

  • Assets
    • MY_PROJECT_NAME
      • Scripts
      • Tests
      • とか

Editor/の置き場所は、MY_PROJECT_NAME/の直下だったり、MY_PROJECT_NAME/Scripts/下だったり、毎回定まっていません*1

Assets外

主にビルドスクリプト*2で以下のように指定しています。いずれも.gitignore(後述)で除外指定されているところ。

  • ビルド成果物は Builds/
  • ログは Logs/
  • テスト結果も Logs/
  • コードカバレジ*3も Logs/

.gitignore

giboでベースを生成

.gitignoreファイルはgiboで生成したベースに、プロジェクトごとの設定を追加しています。

github.com

私はIDEにJetBrains Riderを使っているので、次のように。

$ gibo dump Unity JetBrains >> .gitignore

これで、以下2つの定義が連結された.gitignoreができます。

Rider以外のIDEを使用する場合は JetBrainsVisualStudioVisualStudioCode に置き換えます。

なお、OSごとの定義はあらかじめグローバルの.gitignoreに設定されている前提ですが、gitに不慣れなメンバーもいる状況では macOSWindows を加えてもいいでしょう。

プロジェクト固有の定義を追加

必要に応じて、.gitignoreに追加していきます。

まず極端な例。公開 or 納品するプロジェクトなど、3rd partyのアセットをすべて除外したい場合は、以下のようにMY_PROJECT_NAME以外をすべてトラックしないようにします*4

/Assets/*
!/Assets/MY_PROJECT_NAME*

なお、スラッシュを含めず*を書いているのは、ディレクトリの.metaファイルも含めるためです。

すべてではない場合、シートライセンスのエディタ拡張など、リポジトリに含めたくないものを個別に指定していきます。例えば、

/Assets/ConsolePro*

同様に、Assets/下に生成されるファイルでトラックしたくないものも追加します。代表的なものは以下。

Play Mode tests実行時に作られて、まれによく残ってしまうScene

/Assets/InitTestScene*.unity*

Build Report Inspector

/Assets/BuildReports*

VRCSDKがアップロード用にプロジェクトルートに作るファイル

/*.unitypackage

UniVRMで生成する中間ファイル

/Assets/*.vrm
/Assets/*.vrm.meta

Code Coverage packageの設定ファイル*5*6 /ProjectSettings/Packages/com.unity.testtools.codecoverage/

アセット提供側が気をつけたいこと

アセット提供側としても、自身のアセットはAssets/直下に置くのでなくディレクトリを切るべきです(以下MY_ASSET_NAMEとします)。

また、再配布可能な他者のアセットを同梱する場合は、MY_ASSET_NAMEの下ではなく、オリジナルのディレクトリに置くと、他のアセットとの競合を避けられます。

アセットの設定ファイルをAssets/MY_ASSET_NAME/下に置いてパス指定で読み書きしてしまうと、ユーザがディレクトリを変更できなくなり不便です。 設定は、 Settings Manager package を使用してProjectSettings/下に保存するようにすると使いやすくなります(Unity 2018.3 以降)。

*1:Editor/は、Assets/直下でなくどこにあってもEditor扱いされますし、asmdefファイルを置けばEditorという名前でないディレクトリをEditor扱いすることも可能です

*2:Makefile老人会なのでMakefile

*3:Code Coverage packageの場合、設定で出力先を変更できます

*4:ただし、エディタ拡張だけでなくランタイムのスクリプトその他も除外するのは、納品には良いのですがCIで不便です。Gitはこの設定で、CIはignore定義が別のUnity Collaborateにするという手もあります

*5:0.3.0-previewからここに保存されるようになったが、出力先をフルパスで保存してしまうので除外

*6:0.4.0-preview相対パスで保存されるように修正された