1)Addressablesがアセットをホットアップデートするのパスについて
2)Unity 2018AndroidプラットフォームのBlitTypeがNeverに設定されている場合、画面は暗くなる
3)ビデオ圧縮方式
4)AssetBundleのアセットの冗長性に関して
5)ロード時にAddressableがサーバーを比較しない方法
Addressables
Q:Addressablesがアセットをホットアップデートするのパスに関して、一部のアセットをAddressablesシステムのStreamAssetsにパッケージ化し、アセットがCannot Releaseに設定します。完了後、アセットを変更し、ホットアップデートプロセスを行います。そして、プログラムを実行してホットアップデートが検出され通常どおりにダウンロードできますが、ダウンロードしたAssetBundleパッケージはPersistentDataPathパスにありません。同じ実機にある場合、ホットアップデートパッケージはUnityエディターのTempパスにありますが、何もインストールされていない新しいコンピューターにプログラムを移動すると、プログラムはホットアップデートのダウンロードを検出できますが、 PersistentDataPathには相変わらずホットアップデートのAssetBundleが表示されません。
A1:Addressableのダウンロード更新はキャッシュ方式を使用するため、以下に示すように、PersistentDataPathには含まれませんが、アプリケーションのデフォルトのキャッシュディレクトリに含まれます。
最後に、それをAddressableAssetSettingsのInitialization Objectリストに入れます。
A2:【問題主から】ご協力いただきありがとうございます。この方法では、実際にキャッシュパスを書き換えることができます。Cache Directory Overrideは、Addressables Profilesのパスとまったく同じように変数パスを構成できないことに注意してください。{UnityEngine.Application.persistentDataPath}などの「{}」を含むメソッドのみをサポートし、「[]」は構成をサポートしません。助けてくれてありがとう!
さらに、次の図に示すように、上位レベルのCache Directory Overrideによって最終的に呼び出されるソースコードは、必要に応じて拡張できます。
A3:Androidにapkをインストールして実行した後、apkのパッケージ名がcom.x.yであると仮定すると、Androidにはさらに3つのディレクトリがあります。
ディレクトリ1:sdcard / Android / data / com.x.y、このディレクトリの下にcacheディレクトリがあります。
ディレクトリ2:data / app / com.x.y-1、このディレクトリにはlibとoatのディレクトリがあり、base.apkもあります。
ディレクトリ3:data / data / com.x.y、このディレクトリには5つのディレクトリ、files、shared_prefs、cache、code_cache、libがあります。
上記のディレクトリ1のsdcardとディレクトリ2のデータは同じレベルにあります。ディレクトリ2とディレクトリ3を表示するには、root化する必要があります。rootがないスマホは、sdcarの下のファイルしか表示できません。
Addressableを実行してアセットをリモートでロードすると、ディレクトリ1のcacheと同じレベルに追加filesディレクトリがあります。このfilesディレクトリはApplication.persistentDataPathであるはずです。このfilesディレクトリには、さらに2つのディレクトリがあります。catalog.hashとcatalog.json があるcom.unity.addressablesと、ダウンロードしたAssetBundle が含まれているSharedとEmptyのTemp があるUnityCacheディレクトリです。AddressableはCachingメカニズムを使用するため、Caching.currentCacheForWriting = Caching.AddCache( “D:/ Shalou / UnityCaching /”);と同様の操作で、PCのキャッシュディレクトリを変更できます。Androidでも可能です。これはAndroidの権限に関連しており、これ以上のテストは行われていません。ExternalのWrite Permissionが有効になっていない場合、ディレクトリの置換はディレクトリ1の下のfilesディレクトリでのみ実行できます。つまり、Application.persistentDataPathの後にサブディレクトリを追加してキャッシュディレクトリを変更できます。
PCでは、以下に示すように、デフォルトのキャッシュとpersistentDataPathは実際には2つのパスです。
Rendering
Q:Blit TypeをAlwaysに設定すると、Blit操作がもう1回行われることを確認しましたが、2018年の実機テストでは、コントラストを上げて画像を暗くする効果が示されました。Alwaysに戻すと正常に機能します。
色空間は線形空間です。
この設定のポイントは何ですか?
A:AndroidBlitType.NeverはsRGBバックバッファーを提供しません。線形レンダリングには、sRGB読み取り/書き込み変換を実行するフレームバッファが必要です(RenderTexture.sRGBを参照)。そうしないと、生成された画像が暗くなりすぎることがよくあります。したがって、線形レンダリングを使用する場合、AndroidBlitType.Neverは推奨されません。 AndroidBlitType.Neverを線形レンダリングに使用する場合は、この情報にかかわらず、独自のsRGBレンダリングターゲットを設定し、バックバッファーに対するBlit操作を処理する必要があります。
次のURLを参照できます。
https://docs.unity.cn/cn/current/ScriptReference/AndroidBlitType.html
https://docs.unity3d.com/ScriptReference/AndroidBlitType.html
Video
Q:ビデオに最適な圧縮方式は何ですか?現在、私たちの元のビデオはほぼ60MBで、圧縮してStreamingAssetsの下に置き、読み取り、解凍して再生すると考えていますが。VideoClip自体の処理に加えて、他の解決策はありますか? AndroidとiOSの両方のプラットフォームをサポートできると思われます。
A1:ビデオをH.264またはH.265でエンコードされたMP4形式に圧縮してみてください。
A2:H.264はUnity2018のすべてのプラットフォームと互換性があります。
Assetbundle
Q:UWAを使用してAssetBundleアセットの冗長性を検出すると、17個のアセットが冗長であることがわかりますが、BundleのManifestファイルを比較してチェックすると、これらの冗長アセットは個別にAssetBundleにパッケージ化され、独自のプリセットアセットに存在しないとわかりました。が、UWAは、この冗長アセットが各プリセットに存在すると結論付けました。それを解決するにはどうすればよいですか。
A:最初にも問題が発生しました。Manifestにはこの冗長性がありません。AssetBundleが読み込まれ、メモリにこの冗長性も見つかりません。GetAllAssetNamesを呼び出しても冗長名も表示されませんが、LoadAllAssetsを呼び出すとこの冗長性が現れました。
理由:RawimageにリンクされているTextureとParticleSystemはUIアセットを参照しています。
冗長性の危険性については説明しません。
解決策:RawimageのグラフとPrefabおよびその他のアセットがAssetBundleにパッケージ化することを確認しようとすると、難しくて疲れるかもしれません
私の解決策:
1、Backgroundを除いて、RawimageにTextureをハングアップすることは禁止されています。正直なところ、私のBackgroundはRGBAで区切られているため、RawimageはMaterialにハングアップし、RawimageはTextureにハングアップしないのは、プロジェクトが非同期に読み込まれるためです。まずPrefabの現れを保証し、重要でないものは後で非同期的に出てきます。
2、UIのPrefabにパーティクルエフェクトをハングアップしたり、ツールを作成したりすることは禁止されています。パーティクルエフェクトのPrefabがUIアセットを参照することは禁止されたのは、パーティクルエフェクトのParticleSystem記述ファイルが欠落しているため、 UIにハングアップする場合、PrefabのサイズはMになる可能性があり、ロード速度に影響します。同時に、パーティクルエフェクトとUIPrefabの分離によって、冗長性が発生することはありません。
Addressables
Q:現在の特定のインターフェイスを読み取ってから、サーバーにアクセスして判断する代わりに、ゲームに入るときに更新を均一にロードしたいです。
ここで問題となるのは、ロードされるたびにサーバーを判断するのではなく、サーバーに入るときにすべての更新を判断する方法はありますか。
A:ゲームの開始時に、専用の更新インターフェイスで更新します。具体的には、最初に初期化してから、GetDownloadSizeAsyncとAddressables.DownloadDependenciesAsyncを呼び出してAssetBundleを更新することです(AddressableはAssetBundleを最小の更新単位として使用します)。更新が必要なAssetBundleはローカルにキャッシュされ、次にこれらのアセットが使用されるときに、リモートでダウンロードする必要はありません。コードは次のとおりです。
IEnumerator Start()
{
//パッケージ化時にDisable Catalog Update on Startupを選択しない限り、初期化中にCatalogが自動的に更新する
yield return Addressables.InitializeAsync();
IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators;
List<object> keys = new List<object>();
//全てのkeyをトラバースする
foreach (var locator in locators)
{
foreach(var key in locator.Keys)
{
keys.Add(key);
}
}
var handle = Addressables.GetDownloadSizeAsync(keys);
yield return handle;
long downloadSize = handle.Result;
if (downloadSize > 0)
{
yield return Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, true);
}
}
ゲーム中、Addressableが初期化された後、Addressables.CheckForCatalogUpdatesとAddressables.UpdateCatalogsが呼び出されない限り、メモリ内の常駐Catalogによって生成されたマッピングテーブルオブジェクトは変更されません。サーバーのCatalogとアセットが更新されてもクライアントの操作に影響を与えません。
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。
今なら、UWA GOTローカルツールが15日間に無償試用できます!!
よければ、ぜひ!
UWA公式サイト:https://jp.uwa4d.com
UWA GOT OnlineレポートDemo:https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ:https://blog.jp.uwa4d.com