Toko Apple dan iOS mengoptimalkan instalasi aplikasi iOS, tvOS, dan watchOS dengan menyesuaikan pengiriman aplikasi ke kemampuan perangkat khusus pengguna. Optimasi ini disebut penipisan aplikasi. Penipisan aplikasi memungkinkan Anda membuat aplikasi yang menggunakan fitur perangkat yang paling, menempati ruang disk minimum, dan mengakomodasi pembaruan masa depan yang dapat diterapkan oleh Apple. Pelajari lebih lanjut tentang proses optimasi ini pada Halaman Perpustakaan Pengembang Apple di App Thinning.
Bab ini menjelaskan dua komponen utama penipisan aplikasi yang dapat diterapkan pada Unity:
Sumber daya on-demand (ODR) adalah fitur yang tersedia untuk platform iOS dan tvOS, dari versi 9.0 dari iOS dan tvOS di atas. Hal ini memungkinkan Anda untuk mengurangi ukuran aplikasi Anda dengan memisahkan Aset inti (yang diperlukan dari startup aplikasi) dari Aset yang mungkin opsional, atau yang muncul di tingkat selanjutnya permainan Anda. Aset tambahan ini disebut AssetBundles. Mereka tersedia di semua target build Unity, tetapi langkah-langkah tambahan harus diambil untuk memungkinkan mereka untuk dihosting melalui App Store.
AsetBundles dapat mengandung Aset file seperti model, Bahan, Tekstur dan ScenesAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary, tetapi mereka tidak dapat mencakup scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary. Ini berarti bahwa semua logika skrip Anda harus berada di aplikasi utama. Apple merekomendasikan bahwa AssetBundle tidak lebih besar dari 64MB dalam ukuran, untuk mengurangi waktu pemuatan (khusus over-the-air) dan meminimalkan jumlah ruang penyimpanan yang digunakan pada perangkat.
Untuk mengatur proyek Anda untuk ODR, periksa pertama bahwa jenis build Anda diatur ke iOS. Di bilah menu, pergi ke File > Build Settings.
Jika belum dipilih, klik pada iOS, lalu klik tombol Switch Platform. Berikutnya, klik tombol Player SettingsPengaturan yang memungkinkan Anda mengatur berbagai pilihan khusus pemain untuk permainan akhir yang dibangun oleh Unity. More info
Lihat di Glossary. Di jendela InspectorJendela Unity yang menampilkan informasi tentang Pengaturan GameObject yang dipilih saat ini, aset atau proyek, memungkinkan Anda untuk memeriksa dan mengedit nilai. More info
Lihat di Glossary, buka Other Settings, arahkan ke bagian Configuration, dan aktifkan kotak cemen.Use on demand resources checkbox.
Pertama, buat folder baru untuk mengelompokkan Aset yang ingin Anda tempatkan ke AssetBundle. Untuk melakukan ini, klik kanan di dalam jendela Proyek dan pergi ke Create > Folder (atau klik Create > Folder di bagian atas jendela Proyek).
Pilih file Asset yang ingin Anda tambahkan ke AssetBundle, lalu tarik-dan-jatuhkan ke folder baru Anda.
Saat membuat AssetBundle, Anda perlu menetapkan tag, yang digunakan sebagai pengidentifikasi ketika meminta unduhan AsetBundle. Praktik yang baik untuk membuat label yang sesuai dengan nama file bundel; ini memastikan label yang unik, dan memudahkan untuk mengenali ketika Anda bekerja dengannya nanti.
Untuk membuat atau menetapkan tag, pilih folder baru Anda dan arahkan ke bagian Label Aset di bagian bawah jendela Inspektur. Klik menu drop-down kiri, pilih New, dan masukkan nama label baru Anda. Perhatikan bahwa label AssetBundle harus lebih rendah.
Dalam contoh ini, folder yang disebut Textures diberi label baru
Untuk menghasilkan file AssetBundle baru, label baru harus direferensikan dalam skrip Editor. Untuk membuat skrip Editor, buat folder baru di dalam jendela Proyek yang disebut Editor. Klik kanan pada folder Editor dan pilih Create > C# Script. Nama script baru BuildiOSAssetBundles.cs.
Dalam contoh ini, folder Textures telah diberikan label textures. Skrip baru BuildiOSAssetBundles.cs telah dibuat di folder Editor.
Buka BuildiOSAssetBundles.cs dan salin kode di bawah ini. Dalam contoh ini, label textures telah digunakan; mengubah ini sepanjang dengan nama label Anda (dalam teks kasus lebih rendah).
Perhatikan bahwa contoh ini menggunakan bundel yang tidak terkompresi; namun, ini bukan persyaratan untuk menipiskan aplikasi.
using UnityEngine;
using UnityEditor;
public class BuildiOSAssetBundles : MonoBehaviour
{
[InitializeOnLoadMethod]
static void SetupResourcesBuild( )
{
UnityEditor.iOS.BuildPipeline.collectResources += CollectResources;
}
static UnityEditor.iOS.Resource[] CollectResources( )
{
return new UnityEditor.iOS.Resource[]
{
new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" ),
new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" ),
};
}
[MenuItem( "Bundle/Build iOS AssetBundle" )]
static void BuildAssetBundles( )
{
var options = BuildAssetBundleOptions.None;
bool shouldCheckODR = EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS;
#if UNITY_TVOS
shouldCheckODR |= EditorUserBuildSettings.activeBuildTarget == BuildTarget.tvOS;
#endif
if( shouldCheckODR )
{
#if ENABLE_IOS_ON_DEMAND_RESOURCES
if( PlayerSettings.iOS.useOnDemandResources )
options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif
#if ENABLE_IOS_APP_SLICING
options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif
}
BuildPipeline.BuildAssetBundles( "Assets/ODR", options, EditorUserBuildSettings.activeBuildTarget );
}
}
Garis signifikan dalam sampel kode di atas adalah berikut, yang mengambil file yang ditandai dengan label textures dan membuat file AssetBundle disebut textures dalam folder Assets / ODR:
new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" )
Untuk tujuan demonstrasi, sampel kode di atas juga mencakup garis berikut, yang menambahkan AsetBundle yang disebut bundle yang telah dibangun - misalnya, dari proyek lain atau vendor pihak ketiga:
new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" )
Seluruh sampel kode menciptakan menu baru di bar menu Editor Unity. Bundle > Build iOS AssetBundle. Ini menghasilkan folder AssetBundles dalam folder ODR.
Skrip berikut men-download textures ODR Asset Bundle, menetapkannya ke anggota publik TextureBundle. Tempatkan tempat ini di proyek Anda.
using UnityEngine;
using UnityEngine.iOS;
using System;
using System.Collections;
public class LoadBundle : MonoBehaviour
{
public AssetBundle TextureBundle;
void Start( )
{
StartCoroutine( LoadAsset( "textures", "textures" ) );
}
public IEnumerator LoadAsset( string resourceName, string odrTag )
{
// Create the request
OnDemandResourcesRequest request = OnDemandResources.PreloadAsync( new string[] { odrTag } );
// Wait until request is completed
yield return request;
// Check for errors
if( request.error != null )
throw new Exception( "ODR request failed: " + request.error );
TextureBundle = AssetBundle.LoadFromFile( "res://" + resourceName );
request.Dispose( );
}
}
Langkah selanjutnya adalah menghasilkan proyek Xcode, membangun .IPA, dan mengunggahnya ke TestFlight iTunes Connect. Sebagai bagian dari prosedur pemrosesan TestFlight, Aset ODR tertanam dihapus dari aplikasi dan dihosting di server Apple, siap untuk mengunduh.
Sebelum Anda membangun . IPA di Xcode, periksa Pengaturan Build XCode untuk memastikan bahwa di bagian Aset, Embed Asset packs In Product Bundle diatur ke No, dan Enable On Demand Resources diatur ke Yes.
Setelah iTunes Connect selesai memproses unggah aplikasi Anda, klik pada versi build di TestFlight Builds untuk melihat informasi lebih lanjut tentang hal ini:
Penjelasan aplikasi mengikuti proses yang mirip dengan on-demand resourcing, memungkinkan Anda untuk men-download Aset secara dinamis sesuai spesifikasi perangkat aplikasi berjalan pada (misalnya, untuk mengunduh Aset resolusi tinggi untuk iPad retina, dan Aset resolusi rendah untuk perangkat yang lebih kecil seperti iPhone dan iPad Mini). Ini dicapai dengan menentukan AsetBundles, dengan ketentuan tambahan variants. Cara ini, Anda dapat memutuskan pada startup yang varian untuk digunakan, dan secara otomatis menerapkan ini ke nama file Asset saat diunduh.
Untuk membuat Variant, klik pada folder baru Anda dan arahkan ke bagian Asset Labels di bagian bawah jendela Inspector. Klik pada menu drop-down yang tepat, pilih New, dan masukkan nama varian baru Anda. Perhatikan bahwa varian AssetBundle harus lebih rendah.
Varietas baru harus direferensikan dalam skrip Editor. Untuk membuat skrip Editor, buat folder baru di dalam jendela Proyek yang disebut Editor. Klik kanan pada folder Editor dan pilih Create > C# Script. Nama script baru BuildiOSAppSlices.cs.
Salin dan tempel kode di bawah ini, mengganti label contoh ("teks") dan varian ("hd" dan "sd") dengan Anda sendiri. Dalam contoh kode ini, beberapa folder disebut: satu yang mengandung tekstur HD, dan satu yang mengandung tekstur SD. Ini telah diberikan varian “hd” dan “sd” masing-masing.
using UnityEngine;
using UnityEditor;
public class BuildiOSAppSlices : MonoBehaviour
{
[InitializeOnLoadMethod]
static void SetupResourcesBuild( )
{
UnityEditor.iOS.BuildPipeline.collectResources += CollectResources;
}
static UnityEditor.iOS.Resource[] CollectResources( )
{
return new UnityEditor.iOS.Resource[]
{
new UnityEditor.iOS.Resource("textures").BindVariant( "Assets/ODR/textures.hd", "hd" )
.BindVariant( "Assets/ODR/textures.sd", "sd" )
.AddOnDemandResourceTags( "textures" ),
};
}
[MenuItem( "Bundle/Build iOS App Slices" )]
static void BuildAssetBundles( )
{
var options = BuildAssetBundleOptions.None;
bool shouldCheckODR = EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS;
#if UNITY_TVOS
shouldCheckODR |= EditorUserBuildSettings.activeBuildTarget == BuildTarget.tvOS;
#endif
if( shouldCheckODR )
{
#if ENABLE_IOS_ON_DEMAND_RESOURCES
if( PlayerSettings.iOS.useOnDemandResources )
options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif
#if ENABLE_IOS_APP_SLICING
options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif
}
BuildPipeline.BuildAssetBundles( "Assets/ODR", options, EditorUserBuildSettings.activeBuildTarget );
}
}
Ini menciptakan menu baru di bar menu Unity Editor yang disebut Bundle. Klik ini dan pilih satu-satunya item dalam daftar, Build iOS App Slices. Ini menghasilkan folder AssetBundles dalam folder ODR.
Kemudian, untuk memuat Aset, tempatkan kelas ini di suatu tempat dalam proyek Anda dan melewati nama Variant yang ingin Anda beban:
using UnityEngine;
using UnityEngine.iOS;
using System;
using System.Collections;
public class LoadBundle : MonoBehaviour
{
public AssetBundle TextureBundle;
void Start( )
{
StartCoroutine( LoadAsset( "textures", "textures" ) );
}
public IEnumerator LoadAsset( string resourceName, string odrTag )
{
// Create the request
OnDemandResourcesRequest request = OnDemandResources.PreloadAsync( new string[] { odrTag } );
// Wait until request is completed
yield return request;
// Check for errors
if( request.error != null )
throw new Exception( "ODR request failed: " + request.error );
TextureBundle = AssetBundle.LoadFromFile( "res://" + resourceName );
request.Dispose( );
}
}
Sekarang Anda dapat melihat dan memodifikasi varian dalam menu drop-down Player Settings > Other Settings > Configuration (menu hanya terlihat jika Variant map for app slicing diaktifkan di Pengaturan Pemain).Use on demand resources is enabled in the Player Settings).
Untuk mempelajari lebih lanjut tentang sumber daya AssetBundles dan on-demand, lihat Proyek demo Manajer AssetBundle Unity, yang dihosting di Bitbucket. Halaman pendaratan menawarkan deskripsi komprehensif tentang cara menggunakan dan mengubah demo.