Unityのクリッピング規則


今回の主な話題:Unityのクリッピング規則、キャラメイク機能の実現方法、Graphics.Bilt時間コスト分析、携帯をロック解除してゲームに戻る時ゲームUI が変形する。


製作

Q1:Unityバージョン5.5.4f1、設備はHuawei Honor v10、Androidバージョン8.0、水平画面ゲームが支払いために垂直画面に引き上げた後、水平画面に戻る時ゲームの解像度がエラーになりました。画面の半分が黒ですが、NGUIクリック位置は正常です(レンダリングされた位置ではなく本物の位置にあります)。

Unity 4.xでもこの問題が発生しました、Androidバージョンも8.0。ログを確認して、横と縦が外部から変更されていることがわかりました。C#レイヤーで解像度を設定しようとしても解決策はありません。最後に、UnityのUnityPlayerNativeActivityファイルを変更し、Androidレイヤーの解像度をリセットしましたが、現時点では他の悪いところは見つかりませんでした。

@Override
    protected void onCreate(Bundle paramBundle) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(paramBundle);
        getWindow().takeSurface(null);
        getWindow().setFormat(PixelFormat.RGBX_8888);
        this.mUnityPlayer = new UnityPlayer(this);
        setContentView(this.mUnityPlayer);
        this.mUnityPlayer.requestFocus();
        saveWidthHeight();
    }
@Override
    protected void onResume() {
        super.onResume();
        setLayoutParams();
        this.mUnityPlayer.resume();
    }
private void setLayoutParams() {
        if (Build.VERSION.SDK_INT >= 26) { //android 8.0
            mUnityPlayer.getView().getLayoutParams().width = width;
            mUnityPlayer.getView().getLayoutParams().height = height;
        }
    }
private void saveWidthHeight() {
        if (Build.VERSION.SDK_INT >= 26) {
        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        display.getRealMetrics(dm);
        width = dm.widthPixels;
        height = dm.heightPixels;
        }
    }

アセット管理

Q2:Unityのクリッピング規則について教えてください。2015年初にIL2PPが実装されたばかりの時にはこの問題をよくみられました。
今までもUnity公式から明確な規則を定めていませんが、大まかな解決策はlink.xmlを追加することです。いくつかのプラグインの解決策はこちらに参考できます:http://forum.arongranberg.com/search?q=il2cpp

少し前に、SLuaホワイトリストのクリッピングを行っているときに同じ問題に遭いました。 下記の部分を理解しました:

◎link.xmlが指定したのはクリップされません(ただし、ワイルドカードがサポートされているとドキュメントに記載されていますが、試したけど出来ませんでした)
◎パッケージが依存するアセット(つまりEditor.logにある部分)は自動的に分析されます
◎PreserveAttributeマーク

最も厄介な部分は、AssetBundleにパッケージされたアセットです。AssetBundleに入力されたアセットにはAnimator Controllerがありますが、外部のResourcesなどにはそのようなものはありません。だからデフォルト状況でAC対応類別はクリップされますが、実行時に必要がありますから崩壊してしまいました。
解決ために自分がYAMLを分析することができます、こちらを参照して:https://docs.unity3d.com/Manual/ClassIDReference.html

PS:実にはACは最も妙なものであり、この対応類別はまだわかりません。今は回避のためにResourcesの下に一つの空きACを配置します。


製作

Q3:ゲーム内のキャラメイクの具体的な実現方法について聞きたいです。ネットで調べましたけど、相関資料は少ないです。ゲーム「天涯明月刀」に関する記事一編とHoney Selectを紹介する記事一編のみ検査しました。それを読んだ後もまだ不明な点が多いと感じます。参照用の相関オープンソースコードがあるかどうかを知りたいです。

君が話したのは逍遥剣客さんが書いたこの文章:https://zhuanlan.zhihu.com/p/28471808
(中国語注意)

実際には、Honey Selectは暗号化されていません。UnityStudio+dnSpyで直接開けます。
入社後の最初のシステムはキャラメイクでした。もちろん当時はKang Laiさんほどの豊富なゲーム経験はなかったので、参照したのは基本的に社内の情報でした。ほとんどの機能は「Honey Select」にあります。まとめると:
1.骨格に基づいて調整します。
骨格のScale、Rotationを調整し、Positionは比較的使用されていません。Kang Laiさんのブログにもう非常に詳しく説明されているため、これ以上は説明しません。
2.メッシュの差に基づいて。
この部分は、前に言及されていない部分です。骨の数が制限されている場合、または骨がうまく作成できない場合には、最大と最小の2つの極値メッシュが作成され、両者の差より中間メッシュ値を計算します。そして実行時に最終表示されるメッシュを生成します。骨格調整との違いは、骨格アニメーションとメッシュアニメーションの差と多少似ています。
3.材質に基づいて。
メッシュが変更されていない場合、肌の色、瞳の色、唇の色、タトゥーのデザインなど、材質のテクスチャまたはパラメータの変更を通じて変更できます。(UVの変更で、タトゥーの色などをカスタマイズすることができます。)
4.新しいメッシュ。
この部分は「Honey Select」にも言及されています。プログラムにとして最も簡単な部分でありますが、アーティストにとして最も複雑な部分です。ヘアスタイル、ファッション、他のエクストラアクセサリーなどに使用されます。

検索キーワードについては、character customizationなどを参照できます。
ちなみに、キャラメイクシステム実行中の効率を保証すると共に、プレビューの速度を確保する必要もあります。時々にこの二者の間に衝突が発生する場合があります。多法案サポートやメモリを効率に交換するなどの方法で最適化できます。モバイルゲームの場合は、極端状況でのレンダリング効率とメモリコストを注意することをお勧めします。材質パラメータの変更がある場合、バッチ処理することはできません。骨格またはメッシュに基づく変更も、一定量のメモリを消費します。


レンダリング

Q4:下記の画像はUWAのパフォーマンスレポートです。Graphics.Blitのコストが小さくないことがわかります。これは何のためですか?オフにされませんか?

カメラのHDRはデフォルトでオンにされています。このチェックを外すと消えます。通常に、あの位置のGraphics.Blitは、 スクリプトによって追加されたカメラ後処理ではなく、HDRまたはAAなどのような、エンジン自体が開いた後処理であります 。


UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析最適化ソリューション及びコンサルティングサービスを提供している会社でございます。

UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com