ハレとケ展 現場のUnity

37
ハレとケ展 -現場のUnity-

Transcript of ハレとケ展 現場のUnity

ハレとケ展

-現場のUnity-

ハレとケ展東北の伝統行事をモチーフにした体験型アート作品

ここで動画を再生

システム構成(1ブロック)

Kinect x 2WindowsPC x 2単焦点PJ x 1

開発環境(描画マシン)Windows 10 pro 64bit

Unity 5.4.2f2

Visual Studio 2015

Max MSP (サウンド用)

開発環境(センシング)Windows 10 pro 64bit

Openframeworks 0.9.8

Visual Studio 2015

バージョン管理git でローカルLANにリポジトリ

シーンのマージにはUnity Smart Merge(後述)

フロントエンドにSourceTree

少人数・短期間のため、

多少データが大きいが、リソースも気にせずすべてコミット

現場のUnityメリット

・とにかくすぐ動く

・パラメータを変えてのテストが一瞬でできる

・超高速イテレーション

・CGデザイナーが直接修正可能。フレンズによって、得意なこと違うから!

・アセットストアでめっちゃいい出来合いのアセットがたくさんある

・シーンビューの自由度が高く、制作・デバッグ共に捗る

現場のUnityデメリット

・微妙な問題(メモリリークや拡張アセットの不安定性)は普通にある

・Unityの分厚い抽象レイヤーの中でおこるバグを回避するのが大変

・シーン同士マージが不安定でややコラボレーションに問題

・ガベージコレクションのスパイクが結構うざい

特に便利だったアセット・Alembic Importer (https://github.com/unity3d-jp/AlembicImporter)  Unity上での実装が難しい複雑なポリゴンアニメーションを読み込む

・Pixel Perfect Game Window (https://www.assetstore.unity3d.com/jp/#!/content/25045)  UnityのGameウィンドウを完全にフルスクリーンにする

・Dynamic Bone (https://www.assetstore.unity3d.com/jp/#!/content/16743)  揺れもの系の制御

・PostProcessing(https://github.com/Unity-Technologies/PostProcessing)  言わずと知れたポスプロアセット

・UnityOSC(https://github.com/jorgegarcia/UnityOSC)  センシングアプリとの通信など

Kinect StudioKinectの情報を録画して、Kinectを刺さなくても

再生やデバッグに使うことが可能

アプリ側は何もしなくてもキネクトが刺さっている

かのようにふるまう(ここ重要)

開発中に起こった問題Unityでも色々起こる・・・

AlembicImporterメッシュをInstantiateするとマテリアルがはずれる。

マテリアルを設定するスクリプトを作ればいいのだが、

マテリアル操作が煩雑になり、管理が面倒・・・

AlembicImporterメッシュをInstantiateするとメモリが増えつづける

大量にInstanticateするシーンは1時間で10GB持って行かれた

さらになぜがUnityのガベージコレクションにも悪影響があり、GCが走る

たびにひどいスパイクが発生。

原因を探ったが修正が困難だと判断して、大量に使う部分は連番メッ

シュに修正して解決。最終的には変身のみAlembicを使用。

GC.Collectのスパイク

Unityの資料にしたがって、定期実行していたが、特に効果的でもなく頻

繁なスパイクの原因になったので結局やらないことに。

Materialなどのリソースメモリリーク

Materialなど、Unityリソースはガベージコレクションでは回収されない。

なのでガンガンメモリが増えていく。

Resources.UnloadUnusedAssets

を定期実行で対応

ただキャッシュまでクリアされてしまうので、状況によっては使えない方法

かも

また、そもそも毎フレームのリソースアロケーションに注意

Materialなどのリソースメモリリーク

プロファイラーできっちりチェック

SmartMargeUnityシーンがバージョン管理ツールでマージできる!!!

設定 YamlMergeのパスを通す

C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe or C:\Program Files (x86)\Unity\Editor\Data\Tools\UnityYAMLMerge.exe

.git/config に登録する

[merge] tool = unityyamlmerge

[mergetool "unityyamlmerge"] trustExitCode = false cmd = 'UnityYAMLMerge.exe' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"

C:\Program Files\Unity\Editor\Data\Tools\mergespecfile.txt を編集する

unity use "%programs%\Perforce\p4merge.exe" "%b" "%l" "%r" "%d"prefab use "%programs%/p4merge.app/Contents/Resources/launchp4merge" "%b" "%l" "%r" "%d"

P4Merge(https://www.perforce.com/downloads/helix#product-10)のHELIX P4V: VISUAL CLIENTを入れれば完了

SmartMarge問題

大きなシーンだとクラッシュすることがあった

マージに失敗すると、結局手動マージになってしまうので、

後半は失敗が怖くて結局シーンはマージしなければならない状況をそも

そも回避するようにした。

みんなマージどうやってるの・・・?

.unitypackage 問題

プロジェクトファイル間のデータ移動に便利だが、

基本的にデータ上書きなので、うっかりするとファイルが先祖返りする

上書きマーク

これで5時間は無駄にした

なるべくgitで対応するか、細

心の注意で使う

Graphics Quality問題

Unityには複数のスペックの違う実行環境に対応するために、

処理を分ける仕組みがある

 Edit/Project Settings/Quality を選択

通常はビルドしたアプリ実行時に設

定ウィンドウが出現して、

そこから選ぶ。

Graphics Quality問題

ただ、今回のアプリの場合、最初の設定画面をスキッ

プしていた。

別なマシンに持っていった時に、設定が変わってし

まった。

・アンチエイリアスが効かなくなる

・特定のオブジェクトが描画されなくなる

・影が出なくなる

などの形で表面化して原因特定に時間がかかった

Graphics Quality問題

結局一つだけ設定を活かしてほか

はすべて非アクティブに設定で解決

した。

フルスクリーン問題

解像度を指定して設定しているのに、なぜか起

動時にフルスクリーンにならない

コマンドライン引数で設定を強制上書きで解決

-screen-fullscreen 1 -screen-width 1920-screen-height 1080

透過シェーダー問題(1)

シェーダーを書き換えて対応できるものは対応

透過に標準では対応していないシェーダーで透過したい

透過シェーダー問題(2)透過シェーダーが影をレシーブできない描画順などの問題で、根本的解決が難しいと判断

透過が始まる瞬間にシェーダー(マテリアル)を切り替えて対応。案外目立たなかった。

雪玉が気持ちよく投げれない問題

仕様

手で雪玉を投げられる。それがキャラクターや他の雪玉、地面にぶつかると砕ける。

雪玉が気持ちよく投げれない問題

空間が狭く、投げる瞬間に結構すでにぶつかってしまっている・・・

単純に距離をとる方法もあったが、なるべく現実にリンクした距離感にしたかった

雪玉が気持ちよく投げれない問題

投げる前にぶつかっているコライダーや、自分のキャラクターのコライダーを、Physics.IgnoreCollision(a, b);で投げる前にコリジョンを無効化してしまう

https://docs.unity3d.com/jp/540/ScriptReference/Physics.IgnoreCollision.html

アプリクラッシュ問題(なまはげシーン)

アプリクラッシュ問題(なまはげシーン)

明確な原因不明。発覚時は3時間に1回程度しかおきないくらいだった

そもそもPC版ビルドは、スクリプトで例外やぬるぽがあってもクラッシュまでいかないはず。

ともかくその後検証で偶然3分程度で再現する方法がわかり、検証。

スタックトレースログからGameObjectのSetActive周りが怪しい・・・?

アプリクラッシュ問題(なまはげシーン)

バグ探しの基本は二分探索

半分くらいずつオブジェクトを試しに消してみつつ、バグの範囲を絞っていく。

結果メインキャラクターのボーン付きモデルのSetActiveメソッドを呼ぶのが良くないところまで特定したので、そのかわりにRendererのenableをfalseにすることで対応。

直接的な原因は闇の中。Unityエディタ上でも再現したので100%Unityのバグ

エディタ拡張

あまり使わなかったが、ContextMenuだけは最強に便利1行追加するだけでエディタから直接メソッドが呼べる

[ContextMenu("ThrowTest")]public void ThrowTest(){ SetupReference(); Throw(Vector3.up * 4.0f, null);}

まとめ

・Unityでも当然だがいろいろ問題は発生する

・うまく使えば開発速度は爆速

・地雷は踏み抜いていくもの

・ツールのバグもうまく回避すべし

Thank you!