ハレとケ展 現場のunity
TRANSCRIPT
バージョン管理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) センシングアプリとの通信など
AlembicImporterメッシュをInstantiateするとメモリが増えつづける
大量にInstanticateするシーンは1時間で10GB持って行かれた
さらになぜがUnityのガベージコレクションにも悪影響があり、GCが走る
たびにひどいスパイクが発生。
原因を探ったが修正が困難だと判断して、大量に使う部分は連番メッ
シュに修正して解決。最終的には変身のみAlembicを使用。
Materialなどのリソースメモリリーク
Materialなど、Unityリソースはガベージコレクションでは回収されない。
なのでガンガンメモリが増えていく。
Resources.UnloadUnusedAssets
を定期実行で対応
ただキャッシュまでクリアされてしまうので、状況によっては使えない方法
かも
また、そもそも毎フレームのリソースアロケーションに注意
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問題
ただ、今回のアプリの場合、最初の設定画面をスキッ
プしていた。
別なマシンに持っていった時に、設定が変わってし
まった。
・アンチエイリアスが効かなくなる
・特定のオブジェクトが描画されなくなる
・影が出なくなる
などの形で表面化して原因特定に時間がかかった
フルスクリーン問題
解像度を指定して設定しているのに、なぜか起
動時にフルスクリーンにならない
コマンドライン引数で設定を強制上書きで解決
-screen-fullscreen 1 -screen-width 1920-screen-height 1080
雪玉が気持ちよく投げれない問題
投げる前にぶつかっているコライダーや、自分のキャラクターのコライダーを、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);}