やらなイカ?

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

Unity Automated QAのRecorded Testing機能 トラブルシュート

Unity Automated QA パッケージのRecorded Testing機能を試していて遭遇したトラブルと解消方法をまとめます。 バージョンは 0.2.0-preview.3 および 0.3.0-preview.8*1 で確認しています。

Recorded Testing機能とは、UnityエディタのPlay modeでuGUIの操作を記録したjsonファイルをPlay modeテストとして実行できる機能です。

Unity Automated QAパッケージ全体については先のエントリ参照。

www.nowsprinting.com

[12/26追記]v0.8.1対応の『Unity Automated QA攻略ガイド』をコミックマーケット99で頒布します。詳しくはこちらの記事を参照してください

www.nowsprinting.com

FileNotFoundException: Could not find config.json

テスト実行時、下記スタックトレースが出て失敗するケース。

FileNotFoundException: Could not find file "/Users/***/Library/Application Support/DefaultCompany/UnityTestFramework/config.json"
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at <fb001e01371b4adca20013e0ac763896>:0)
(snip)
System.IO.File.ReadAllText (System.String path) (at <fb001e01371b4adca20013e0ac763896>:0)
Unity.RecordedTesting.Manager.GetDeviceFarmConfig (Unity.RecordedTesting.DeviceFarmOverrides dfOverrides) (at Library/PackageCache/com.unity.automated-testing@0.2.0-preview.3/RecordedTesting/Runtime/Manager.cs:31)
Unity.RecordedTesting.TestResults.RunStarted (NUnit.Framework.Interfaces.ITest testsToRun) (at Library/PackageCache/com.unity.automated-testing@0.2.0-preview.3/RecordedTesting/Runtime/TestTools/TestResults.cs:33)

これは、ローカル環境でテスト実行しようとしているのに、AWS Device Farmで実行するルートに入っているため発生しています。

Edit | Project Settings... を開き、Playerタブ、Other Settings下にあるScripting Define Symbolsの中に CLOUD_TEST_UTF シンボルが定義されていれば、それを削除すれば解消します。

Cloud Test Runnerウィンドウを開いて操作しようとした際にシンボルが設定されたままになっていたようです。

SetUp : System.Reflection.ReflectionTypeLoadException

テストのSetupですべてのアセンブリから型情報を取り出している処理があるのですが、型を含まないアセンブリでこの例外が出ています。

CanPlayToEnd (3.571s)
---
SetUp : System.Reflection.ReflectionTypeLoadException : Exception of type 'System.Reflection.ReflectionTypeLoadException' was thrown.
---
--SetUp
  at (wrapper managed-to-native) System.Reflection.Assembly.GetTypes(System.Reflection.Assembly,bool)
  at System.Reflection.Assembly.GetTypes () [0x00000] in <fb001e01371b4adca20013e0ac763896>:0
  at Unity.RecordedTesting.RecordedTesting.GetAllRecordedTests () [0x00023] in /Users/****/Documents/UnityTestWorkspace/Library/PackageCache/com.unity.automated-testing@0.2.0-preview.3/RecordedTesting/Runtime/RecordedTesting.cs:55
(snip)

遭遇したアセンブリMicrosoft.CodeAnalysis.Scripting で、これはImmediate Window (com.unity.immediate-window) パッケージの依存先になっています。 今回はImmediate WindowパッケージをPackage Managerから削除することで解消しましたが、Automated QA側で対応されるまでは他のアセンブリで発生する恐れもあります。

Scene couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded

Recorded Testingでは、再生しようとするjsonに記録されているSceneをロードしてから操作を開始します。 しかし対象のSceneがビルド設定のScenes in Buildに入っていない場合、この例外が発生します。

SetUp : System.NullReferenceException : Object reference not set to an instance of an object
SetUp : Unhandled log message: '[Error] Scene '***' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.
To add a scene to the build settings use the menu File->Build Settings...'. Use UnityEngine.TestTools.LogAssert.Expect

ビルドに含めるSceneであればScenes in Buildに含めればよいのですが、テスト専用やアセットバンドルに格納するものは別の手段でロードする必要があります。

Unityエディタでの実行であれば、SceneManager.LoadSceneAsyncでなくEditorSceneManager.LoadSceneAsyncInPlayModeを使うことで回避できます。

Standalone playerでの実行では、テスト実行前のビルドにフックするITestPlayerBuildModifierを実装して、ビルド対象Sceneを書き換えることで回避できます。

実装例はこちらを参考にしてください。 github.com

いずれの問題もForumで報告済みなので、そのうち対応されるはず。

参考

docs.unity3d.com

forum.unity.com

*1:本稿執筆時点でPackage Managerからはインポートできますが、マニュアルサイトには未反映

Unity Automated QA雑感

Unity Automated QA パッケージが公開されました。 まだアルファリリース (0.2.0-preview.3) ですが、少し触ってみたメモ。

[12/26追記]v0.8.1対応の『Unity Automated QA攻略ガイド』をコミックマーケット99で頒布します。詳しくはこちらの記事を参照してください

www.nowsprinting.com

概要

Unityエディタ上で動く、uGUI操作のキャプチャ&リプレイ機能です。 Required: Unity 2019.4+

操作記録はjsonで保存され、エディタ上で再生できます。 また、Play mode testsに組み込んで実行でき、さらにAWS Device Farm上のAndroid端末で実行することもできます。

細かいところはまだ発展途上という感ですが、再生機能がかしこくなってくれればそれ単独で使いではありそうですし、 コンポジット機能が実用的になってくれれば(具体的にはuGUI以外も扱えるようになれば)Unityアプリの統合テストフレームワークとして有力になりそうです*1

以下、検証したときのメモです。

Recorded Playback

  • Window | Automated QA | Recorded Playback でウィンドウ表示
  • RecordクリックでPlay modeになり、StopクリックまでのuGUI操作がjsonに記録される
  • 記録したjsonはリスト表示され、Playクリックで再生
  • jsonファイル名はデフォルトでタイムスタンプ、リネーム可能
  • Assertの機構はない
  • 対象オブジェクトが無いなど操作できない場合、コンソールに Warning Error *2 メッセージを出して再生が継続される
  • 実行時にスクショを取っている(~/Library/下に出力され、参照するUIは無い)

jsonフォーマットについて

  • 時間(timeDelta)、座標、object name, tag, hierarchy, offset が記録されている。いい感じに再生時に解釈してくれていることを期待
  • イベントはpointer-down/upで記録しているので、長押しやドラッグも表現できている
  • ButtonのTextやImageは(要するに子オブジェクトまでは)拾っていない
  • idも保持していない。都度変わるので保存しても仕方ないから?
  • Sceneも記録されているがRecorded Playbackでは使用されない(PlayでそのSceneを開いたりはしない)。後述のRecorded Testing機能で使用される

Composite Recordings

  • Window | Automated QA | Advanced | Composite Recordings でウィンドウ表示
  • 複数の操作記録jsonを選択し、つなげたjsonを生成(マージされるのでなく各jsonをポイントするjsonを生成)
  • 部分操作を記録できる(上記Recorded PlaybackだとPlay modeのライフサイクルでしか撮れないので)
  • こちらもAssertの機構はない
  • 将来的に、記録した操作だけでなくC#スクリプトやML-Agentsのエージェントを組み込めるようにしたいとのこと

Recorded Testing

  • Tools*3 | Automated QA | Generate Recorded Tests で、 Assets/AutomatedTesting/GeneratedTests下にPlay modeテストコードが出力される
  • asmdefも作られる
  • テストコードは操作記録jsonと1:1で、中身はjsonを読んで再生している。再生終了後にAssertを自分で追加することは可能
  • テストケースごとに、jsonに記録されているSceneをロードしてから再生してくれる
  • 対象オブジェクトが無いなど操作できない場合、コンソールに Warningメッセージを出して再生が継続される(Recorded Playbackウィンドウでの再生と同様) Errorログを出力して再生は継続されるが、このログのためテストはFailする *4

生成されるテストコードの例

[UnityTest]
[RecordedTest("Recordings/composite-recording-2021-04-19-T01-05-01.json")]
public IEnumerator CanPlayToEnd()
{
    yield return RecordedTesting.TestPlayToEnd();
    Assert.IsTrue(true);
}

この機能で遭遇したエラーとその回避方法はこちらのエントリを参照。

www.nowsprinting.com

Running Recorded Tests on a Cloud Device Farm

  • AWS Device Farm上のAndroid端末でもテスト実行できる*5AWSとの直接契約・操作は不要
    • アーリーアクセス機能
    • 2021/6まで、Unity Proアカウントに100hのクラウドテストを無料トライアル
    • 以降 $10/device/hour *6 *7
  • アップロードなどのUIは実装されている(権利がなくて未検証)

参考

docs.unity3d.com

forum.unity.com

blogs.unity3d.com

*1:到達点は統合テストだと思うので、QAという名前は違和感ありますが。それはそれ

*2:v0.3.1で変更された

*3:なぜ一箇所にまとめてくれないのか

*4:v0.3.1で変更された。もし操作不能を無視してテストを成功させたければ、LogAssertを使えばいい

*5:Automated QAのテストに限らず、and other Unity testsが実行可能。であればパッケージ分けてほしかった

*6:AWS Device Farmを直接使っても $0.17/device/minute == $10.2/device/hour なのでむしろ少し安い。see: https://aws.amazon.com/device-farm/pricing/

*7:表記がhourなのでhour単位に切り上げられる恐れはあるかも。要確認

Unity 2020.2時点のRoslyn Analyzerサポート状況まとめ

Unity 2020.2でRoslynアナライザによる静的解析が動作するようになりました。しかし、まだ色々と制限があるようなので現時点のサポート状況を検証してまとめてみました。

検証に使用したプロジェクト も公開していますので、認識違い等あれば教えていただると嬉しいです。

Unity 2020.2以降の主な更新内容

Unity 2020.3.4

  • Packages下(Embedded package, Local package, Package from UPM registry/ Git URL)かつAssembly Definition File (.asmdef) 管理下のアナライザDLLが認識されるようになった
  • 通常のコンパイルステップで診断が実行されるようになった(以前はファイル更新かReimport契機)

Unity 2020.3.6

  • IDEsプラグインパッケージの対応バージョン*1との組み合わせで、IDEsでもAnalyzer Scope(asmdefの依存関係を反映した適用範囲)が機能するようになった(2021.1.2からのバックポーティング)

Unity 2021.1.0

  • Rulesetの変更が即時反映されるようになった(Unity 2020ではReimportが必要)
  • BatchmodeでビルドするときにもRulesetが反映されるようになった
  • Roslyn AnalyzerがあるとDeterministic Compilationが効かなくなる問題*2が修正された*3
  • Roslyn Analyzerによる重要度Errorの検出がある状態でAssets | Open C# Projectを実行してもslnおよびcsprojファイルが生成(更新)されない問題が修正された*4

Unity 2021.1.2

  • IDEsプラグインパッケージの対応バージョンとの組み合わせで、IDEsでもAnalyzer Scope(asmdefの依存関係を反映した適用範囲)が機能するようになった*5

Unity 2021.2.0

  • 内包するMicrosoft.CodeAnalysis.CSharpバージョンがv3.5からv3.9に変更され、Microsoft.CodeAnalysis.CSharp v3.6以降を使ってビルドされたアナライザ*6が動作するようになった

Unity 2022.1.0

  • 内包するMicrosoft.CodeAnalysis.CSharpバージョンがv3.9からv3.11に変更された [2024-02-29 追記]

アナライザのスコープ/ .csprojへの反映

Unity 2020.2+ JetBrains Rider Editor v2.0.6+ Code Editor Package for Visual Studio Code v1.2.0+ Code Editor Package for Visual Studio v2.0.7
Analyzer Scope (asmdefの依存関係を反映) *7 *8 → ○*9 *10 → ○*11 *12 → ○*13
Assetsフォルダ下のDLLs - → ○*14
Embedded package下のDLLs *15 ☓ → ○ *16 - → ○*17
Local package, UPM registry or Git URLから取得したPackage下のDLLs ☓ → ○ *18 *19 → ○*20 *21 → ○*22 - → ○*23

Unity 2020.2+ 列は、Unity Editor GUIで診断実行する際のアナライザのスコープ(適用範囲)について。

その他は、Assets | Open C# Project でIDEを開くときに生成される.csprojへの反映状況です。 JetBrains Rider Editorはv2.0.6で、Visual Studio Code Editorはv1.2.0で、Unityエディタ向けに設定されたRoslynアナライザのDLLがあると.csprojに <Analyzer> ノードが追加されるようになっています。

Unityエディタ (GUI) / IDEでの診断実行

Unity 2020.2+ JetBrains Rider 2021.1 VSCode VS 2019
診断実行 *24
重要度設定(.ruleset) *25 ☓ → ○*26
重要度設定(.editorconfig)
重要度設定(IDE独自) - *27
診断の抑止(シンボル) *28
診断の抑止(行)*29 ☓ → ○ *30
特定のアナライザ*31 ☓ → ○ *32

空欄は未検証です

CLIでの診断実行

Unity 2020.2+ Batchmode JetBrains ReSharper CLT 2021.1 dotnet build Standalone Analyzer
診断実行 *33 *34
重要度設定(.ruleset) ☓ → ○ *35 -
重要度設定(.editorconfig) -
重要度設定(IDE独自) - -
診断の抑止(シンボル) -
診断の抑止(行) -

空欄は未検証です

所感

もうなにも信じられない

参考

docs.unity3d.com

forum.unity.com

github.com

docs.microsoft.com

docs.microsoft.com

*1:JetBrains Rider Editor v3.0.9+, Code Editor Package for Visual Studio Code v1.2.4+, Code Editor Package for Visual Studio v2.0.11+

*2:検証プロジェクト https://github.com/nowsprinting/DeterministicCompilationWithRoslynAnalyzer

*3:Unity 2020.3.26f1では修正されていない

*4:Unity 2020.3.27f1では修正されていない

*5:Unity 2020.3.6にバックポートされた

*6:Microsoft.Unity.AnalyzersやNUnit.Analyzers

*7:https://docs.unity3d.com/2020.2/Documentation/Manual/roslyn-analyzers.html

*8:asmdefの依存関係に関わらず、全てのアナライザが全ての.csprojに設定される

*9:v3.0.9で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*10:asmdefの依存関係に関わらず、全てのアナライザが全ての.csprojに設定される

*11:v1.2.4で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*12:常に /Applications/Visual Studio.app/Contents/Resources/lib/monodevelop/AddIns/MonoDevelop.Unity/Analyzers/Microsoft.Unity.Analyzers.dll だけが追加される

*13:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*14:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*15:https://docs.unity3d.com/2020.2/Documentation/Manual/roslyn-analyzers.html に記述のある、Plugin Inspectorでラベルの設定がPackages下のDLLでは表示されないため、Assets下でラベル設定した後にPackages下に移動して検証しています

*16:Unity 2020.3.4で解消(Release notesおよびIssue trackerには記載なし)。なお、Unity 2020.3.3以前でもasmdef下にないDLLは有効

*17:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*18:Unity 2020.3.4で解消(Release notesおよびIssue trackerには記載なし)。なお、Unity 2020.3.3以前でもasmdef下にないDLLは有効

*19:.csprojに<Analyzer>ノードは追加されるが、パスがUnityエディタ上のPackages下を指すためDLLの実体が無く無効

*20:v3.0.9で対応

*21:.csprojに<Analyzer>ノードは追加されるが、パスがUnityエディタ上のPackages下を指すためDLLの実体が無く無効

*22:v1.2.4で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*23:v2.0.11で対応。ただしUnity 2020.3.6f1以降もしくは2021.1.2f1以降も必要

*24:Unity 2020.2では診断は当該ファイルのコンパイルもしくはReimportの契機でのみ実行されたが、Unity 2020.3.4で通常のコンパイルステップで動作するよう変更された

*25:Unity 2020では変更を反映するのにReimportが必要だったが、Unity 2021.1でRuleset適用タイミングを早める修正が入ったことによりこの問題も解消

*26:Rider Editor package v3.0.9で対応

*27:Preferences...で設定して.sln.DotSettingsに保存

*28:SuppressMessageアトリビュート

*29:#pragma warning disable/restoreディレクティブ

*30:Rider 2021.1以前ではクイックフィックス候補に"// ReSharper disable"が出るが、Roslynアナライザの診断結果には無効。Rider 2021.2 EAP1以降で"Disable with #pragma"が選択可能になった

*31:NUnit.Analyzersが適用されない。要因は不明

*32:Unity 2021.2で解消

*33:ビルドログに出るのでパースが必要

*34:https://youtrack.jetbrains.com/issue/RSRP-480257 voteしましょう

*35:Unity 2021.1で解消

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 main · Unity-Technologies/ml-agents · GitHub

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

https://blogs.unity3d.com/jp/2020/12/28/happy-holidays-from-the-unity-ml-agents-team/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とか

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

[asin:B07N4G4LH7:detail]

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

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

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

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