絵文字のUGUI処理


今回の主な話題:絵文字のUGUI処理、CreatefromMemoryの使用戦略、Resource.Loadがロードされたときのメモリ変動、Animatorのサンプリング。


メモリ管理

Q1:Unity 5.5.2を使用しています。下の画像は、Redmi 2でテストした8つの特殊効果リソースを示しています。ピーク値は46MBで、その後22.6MBに低下します。このメモリ変動の原因は何ですか?Rendering Batchesが原因ですか?

問題主が提供する例によると、UWAがテストをしました。この問題はUnity 5.5.2のAndroid実機で確かに再現しました。Redmi 2で四つの粒子特殊効果をロードしますと、ロードする前のメモリは:

ロードする中のメモリは:

ロードする後のメモリは:
確かに、Unityのメモリが急速に上昇し、その後下降する「ジッター」現象があります。
これに対して、同じようにRedmi 2で、Unity 5.6.2バージョンの実機テストを実施しました。
ロードする前のメモリは:

ロードする中のメモリは:

ロードする後のメモリは:

まだ、メモリには少量のジッターがありますが、そのジッター範囲は大幅に縮小されています。ですから、R&Dチームに、 同じフレームにあるResources.Loadの読み込み回数で制御するか、Unityの上位バージョンにアップグレードすることをお勧めします。


UGUI

Q2:UGUIの入力フィールドを使用しています。ユーザーが携帯でシステムに付属の絵文字を入力すると、問題が発生し、Input Field枠に異常を引き起こします。たとえば、一つの疑問符があって、削除できません。何かプレーヤーが入力した絵文字を濾過できる方法がありませんか?または絵文字を他の文字に変える方法ありませんか?私は今、正規表現を使用して絵文字表現のユニコードエンコーディングに一致させていますが、このようにすると、カバレッジが不完全な状況はまだあります。

現在の解決策は、コンポーネントをInput Fieldに掛けて、類似のコードを使って絵文字を濾過することです。ただし、すべての絵文字はまだテストしていません。すべての絵文字を濾過できるわけではありませんが、エラー報告はされません。

    public char ValidateInput(string text, int charIndex, char addedChar)
    {
    // 絵文字
    if (char.GetUnicodeCategory(addedChar) == UnicodeCategory.Surrogate)
    {
    return \0;
    }
    }


UWAはUnity 5.5.5p2でこの問題を再現しました。しかし、Unity 5.6.2ではそのような問題はありません。アップグレードは実際にリスクをもたらす可能性があるため、あるアドバイスは正規表現を使うことです。この方法も一般的にインターネットで使用されている方法です。
二つ目は、Unity 5.5.5p2とUnity 5.6.2のUGUIコードの変更を比較し(主にInputField)、自分で修復してみます。UnityEngine.UI.dllも自分でコンパイルします。


アニメーション

Q3:Unity 4.x Animatorはエディターでサンプリングを実行できますか? たとえば、スキルアクションは30フレームです。各フレームのモデルの各ノードの座標回転とスケーリングを知りたいのですが、どうすればよいですか?

1)アニメーションウィンドウで直接表示できます。

2)APIを利用します:AnimationUtility.GetAllCurvesまたはAnimationUtility.GetEditorCurveを使用して、各ノードの各属性AnimationCurveを取得して、各AnimationCurve.keysにある各keyframeのvalueを取得します。
UWAブログには、アニメーションサンプリング、GPUスキニング(中国語注意)アニメーションファイルの精度を抑えるに関する2つのブログがありました。サンプリングに関するコードが含まれています、ぜひ読んでください。


アセット管理

Q4:異なるプロジェクトのAssetBundleは互いに読み取ることができますか? 暗号化の方法はありますか? Unityの異なるバージョンとAssetBundleの互換性はどの程度ですか?

1)Unityのバージョンが対応している限り、AssetBundleはお互いを読み取ることができます。
2)暗号化は一般的なファイル暗号化と同じですが、LoadFromMemoryを介してロードする必要があります。インターネットには多く の方法がありますが、 Googleしてください。
3)Unity 5.xバージョンでは、プロジェクトの上位バージョンは、AssetBundleの下位バージョンの読み取りをサポートしています。AssetBundleでTypeTreeを開く限り(デフォルトは開っている)、理論上問題はありません。


アセット管理

Q5:アセットをロードするためのCreatefromMemory APIに関して、UWAは効率が低いため推奨されていません。dllを更新する必要がありますから、このロード方式を使用していますが、何か他の方法ありませんか?誰もがこのAPIを使用していませんか? または使用できる特別な状況はありますか? このAPIの時間消費を最小限に抑える方法は? 提案をお願いします、ありがとう!

このAPIがコードのホットアップデートにのみ使用されば、確かにそれを使用する必要があります、納得できます。しなければLuaのような方式を使ってコードのホットアップデートをやります。
UWAは推奨していませんのは、Create / LoadFromMemory APIをリソースのロードに頻繁に使用することです。重要な構成ファイルまたはDLLコードの場合は、このAPIを使用してロードできます。


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

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