今回の主な話題:「アートアセット導入管理」、「Camera Layer MaskでUGUIを最適化する」、「ベイク効果エラー」など。
ロード
Q1:毎回アートアセットを大量に導入する時、構築されたバージョンは「材質リファレンスが失う」、「Animator Controllerリファレンスエラー」、「スタンプリファレンスエラー」などのアセットリファレンスエラーがよく出てきます。ローカルでのアートアセットは正しいです、別人のパソコンのエディターで見るのも正しいです、ビルドエディターから見るのも正しいですが、構築されたBundleは壊れました。時々Bundleを削除して再編しますと解決できますが、時にはできません。今、この状況にあったら、解決策はプログラム同僚がビルド機でMetaを削除してもう一度Prefabを作るしかありません。
これはUnityのBugですか、何か避けるまたは最適化する方法ありませんか。今、私たちはPerforceを使ってUnityプロジェクトを管理していますが、アートアセットを管理する時、もっといい流れはありませんか。
私たちのプロジェクトがあった問題について推測します。プロジェクトアセット導入のあるところに問題がある可能性は高いと思います。以下の問題があるかどうかをチェックしてくださいい。
⑴難読化コードを使っていますか。Prefabのスクリプトを難読化しないリストに添付することを忘れたしまい。直列化されたフィールドが難読化された、BundleしたPrefabアセットがロードする時、スクリプトにリファレンスエラーが出てきます。
⑵すべてのアセット導入はOnPostProcessをリロードしてアセット設定を処理します。この一環には何か不合理なところを改めましたか。例えばリファレンス関係を破壊しました。
⑶AssetBundleをパッケージする時、Bundleを構築前にファイルでAPI(UnityのAssetDatabaseのAPIではありません)を操作して直接にあるフォルダを改めたや他のリファレンス関係を破壊可能性のある操作をやって、Bundleを構築し、フォルダ名を復元しました(またはアセットを初期状態に還元しました)。これで、リファレンス関係を失う確率が高いです。
⑷パブリッシュでみては正常ですが、Perforceに改めたMetaファイルもういっぱいあります;このような問題はローカルでA1A2二つの同じアートアセットが違うフォルダにあります。A1はバージョンに制御されていますが、ある操作でローカル臨時アセットA2は元A1のGuidを使いました。本来正確なA1は間違えた新生成したguidを使用させられた(両者交換のように)。そしてA1のMetaは他人とリファレンスを失います。あるいはアップデートして、ローカルで新しいGuidを配分します。アートディレクターはよくこのmissを犯します。
⑸私たちが使ったのは使ったのは5.3.8p2、先週bugみたいな問題に会いました。アーティストが一組の重複なアセットをアップロードしました。アップロードしたら、全て再びGuidを生成します。しかし、たくさんのMetaをUnityにもう一度導入した後、バージョンコントロールに消えましたが、修正効果はまた残ってあります。
⑹もし全部なければ、最小排出法を試すしかありません。プロジェクトの大部分のアセットを削除し、少しずつ増加し、パッケージし、再現し、原因を排除します。出来ないならコードを削除し、少しずつ追加し、パッケージし、再現し…時々愚かな方法もう良い方法です。
UI
Q2:私はUGUIで一つのUIRootを使いました、タイプはScreen Space –Camera、カメラのCulling Maskを使います。もしUIRootが可視であれば、下のUIサブジェクトに不可視Layerを設定しても、削除されないではないですか。何か解決策がありませんか。
UGUIのメッシュ合併はCanvasを単位にするため、CancasのLayerを変更するだけで有効になれます。個別UI要素だけの隠しや現れを速くしたいなら、Scale=0でやると考えられます。Scaleは0の時UIの頂点情報は空になります。そのために隠す時にはメッシュ再構築に参加しません。
レンダリング
Q3:Unity 5.5.4で建物をベイクします(Windowsプラットフォームの下)と、中央の階は黒くなりました。これはどうしてですか。一つの方向ライトしか使いませんでしたが、ベイクする時環境色は白を使いました。
私はある解決策を見つけました。一つのLightmapParametersを生成して、中のBackfaceやToleranceを小さな値を替えればいいです。こちらに使ったのは0.2です。
UI
Q4:NGUI(3.11.1)、Unity5.6.4バージョンに二つのPanelコントロールが出現した後、RenderQで特殊効果階層の失効状況を制御します。
具体的な操作は:
一つのUIRootに二つのPanelがあります。Panel AにあるスクリプトparticleLayerControl.csでRenderQをコントロールして、UIの効果階層問題を解決します。もう一つのPanel B(一つの空のPanel、Layer<Panel)があるの場合には、効果は永遠に最初に描かれた問題は起こる。
Panel Bのない場合には正常です。FrameDebugで発見したのは、Panel Bをオンされる時、特殊効果は永遠に最初に描かれます。しかし、RenderQの値を読み込みますと、特殊効果はUIより大きく成りました。原因は分わかりません。
これは新版NGUIの原因です。UI PanelにもSorting Order概念を入れました。Panel Bをオンしますと、Panel AのSorting Orderが0から1に変化し(Panel BのDepthはPanel AのDepthより小さい)、この際に粒子のSorting Orderは0のままなので、取り替えられました。Panel Bを禁止させ、またはPanel BのDepthを40(Panel Aのより大きい)に変えれば、粒子を現されます。
そのために、particleLayerControlの中にSortingOrder処理を入れ、すなわち粒子のSortingOrderと所在するUI PanelのSortingOrderを常に同じように保持する必要はあります。
Unreal 4 レンダリング
Q5: Unreal 4のMovable光源のShadow Map Cacheについて質問があります、具体的な更新策はどのようなものですか。動的な物体と静的な物体の関係をどうやって処理しますか。Shadow MapをCascadeする必要がありませんか。
Cry Engineのドキュメントも参考にしました:http://docs.cryengine.com/display/SDKDOC2/Cached+Shadows
Unityに移植する可能性はありませんか。あるいは,大面積リアルタイムシャドウの問題(光源の方向が変われ,大部分の物体は動的な物体ですが、頻度はあまり高くない)に対して、解決策はありませんか。光源Spaceで事前にデータをベイクして光源方向を変化させ、一つのShadow Mapで出来ますか。Directional Light Mapのような空間を作れませんか。
①
Unreal 4のMovable LightのShadow Map CacheはStatic、Stationaryのみ使えます。ですから、実はMovableに照らされるStaticのシャドウの計算を最適化させたいです。しかし、モバイル端末ではMovableを使う必要はありません、Stationaryで良いです。Staticオブジェクトのシャドウは事前に計算されました。
Unreal 4の動的オブジェクトはシャドウを計算する時には二回計算します。一回は静的シーンから動的オブジェクトに投影され、もう一回は動的オブジェクトから静的シーンに投影される時です。静的シーンから動的オブジェクトに投影されるシャドウを計算するために、エンジンは一枚の静的シーンのShadow Mapをキャッシュします。そして、動的オブジェクトに対しても静的シーンからの正確なシャドウイングを受けられますが、この方式は時間がかかり、mobileもサポートしていません。
Unreal4にもUnityの静的シーンが動的オブジェクト投影されるシャドウみたいな解決策を提供しました。同じようにshadowの予想結果を間接光情報(もうSH)のある点群(UnityにはLight probe)に貯めます。そして動的オブジェクトの位置によって点群からシャドウシャドウイングを計算されますが、この方式でオブジェクト全体的な輝度変化のみ取得できます、シャドウを正確に計算できません。Unreal 4にはモバイルで後者をお勧めします。
なお、Unityで動的オブジェクトが静的オブジェクトからのシャドウベイクを受けることを解決するのもLight Probeを採用しています。問題主が言いましたのは動的光源と動的オブジェクト、一番良いのはリアルタイムシャドウ計算であります。Shadow Map Cacheを採用して最適化するの場合には、具体的なシーンや要求を考え必要があります。複数のShadow Mapをベイクすることを事前計算するために、二つの要素を考えなければなりませんー光源の変化と動的オブジェクトの変化。もし動的オブジェクトや光源の変化頻度は高くなければ、サンプリングしてShadow Mapを事前計算することはできませんが、このようなShadow Mapのサイズやメモリコストは不明であり、試してみなければ分からないかもしれません。
②
Unreal 4の実現について、他の人もう詳しく分析しました。Unreal 4のソースコードShadowSetup.cpp/ShadowDepthRendering.cppを参考し、SDCM_StaticPrimitivesOnlyに関するコードを検査すれば良いです。ここに他の問題を答えます。
1 移動している静的オブジェクトにどうする
携帯で完璧にするのは難しいので、可能の方式は静的なオブジェクトに一枚のSMをレンダリングします、動的オブジェクトにはplanar shadowを使用できます。
2 Shadow Map Cascade
キャッシュなら、Shadow Mapは同時に更新することができません。もしカメラが頻繁に長距離移動しますが、cascadeはカメラに追従して同時に更新できませんと、過度は不自然になるかもしれません。これはプロジェクトの特性により考えすべきことです。
3 光源は動けるかどうか、一枚のShadow Mapでできるかどうか
これは動き次第です。日光を模擬する場合には、角度は小さいのにシャドウの精密計算を放棄しかできません。ある空間にシャドウの存在を判断する時偏角を加えて、シャドウを平行四辺形に変形のようにします。360度回転をしたい場合に、今はまだcacheと回す時を両立する方法はありません。結局、オブジェクトの四つの面は違うので、一枚のshadow mapで平行四辺形に変形するのは不可能です。
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。
UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com