Anda dapat menggunakan batching untuk mengurangi jumlah waktu dan pemrosesan yang diambil ketika membuat perubahan Aset pada kode Anda.
Jika Anda melakukan perubahan pada beberapa Aset pada kode Anda (misalnya, menyalin atau memindahkan file Aset), perilaku default Aset Database adalah untuk memproses setiap perubahan pada gilirannya, dan melakukan proses Refresh penuh untuk Aset sebelum bergerak ke garis kode berikutnya.
Dalam contoh di bawah ini, tiga aset berubah. Aset1 disalin, Asset2 dipindahkan, dan Asset3 dihapus:
AssetDatabase.CopyAsset("Assets/Asset1.txt", "Assets/Text/Asset1.txt");
AssetDatabase.MoveAsset("Assets/Asset2.txt", "Assets/Text/Asset2.txt");
AssetDatabase.DeleteAsset("Assets/Asset3.txt");
Tanpa batching, Proses Unity setiap perubahan sebelum bergerak ke garis kode berikutnya. Ini tidak hanya membutuhkan waktu yang tidak perlu, tetapi juga memicu banyak callback yang dapat Anda hindari jika Anda menggunakan batching.
Sebagai gantinya, Anda dapat menentukan bahwa Basis Data Aset harus memproses sekelompok operasi sekaligus. Untuk melakukan ini, Anda perlu memberitahu Basis Data Aset untuk menghentikan perilaku normal sebelum Anda membuat perubahan Anda, kemudian beri tahunya untuk melanjutkan setelah perubahan Anda selesai.
Secara khusus, Anda harus mencoba menggunakan batching jika Anda melakukan lebih dari salah satu operasi berikut:
Untuk menentukan bahwa Database Aset harus memproses sekelompok operasi sekaligus, Anda dapat menggunakan metode berikut: AssetDatabase.StartAssetEditing dan AssetDatabase.StopAssetEditing.
AssetDatabase.StartAssetEditing
Metode ini memberi tahu Database Aset yang Anda mulai membuat edit ke Aset. Aset Database memasuki keadaan jeda, dan tidak memproses perubahan lebih lanjut ke Aset Anda sampai Anda memanggil metode StopAssetEditing yang sesuai untuk memberitahu Anda selesai.
AssetDatabase.StopAssetEditing
Setelah Anda melakukan semua Perubahan aset, sebutkan metode ini untuk memberitahu Basis Data Aset untuk memproses perubahan dan melanjutkan perilaku normal dari perubahan pemrosesan otomatis segera. Aset Database kemudian memproses perubahan yang Anda buat antara StartAssetEditing
dan StopAssetEditing
dalam Batch, yang lebih cepat dari jika mereka telah diproses satu per satu.
Jika Anda membuat lebih dari satu panggilan ke StartAssetEditing
, Anda harus membuat jumlah panggilan yang sesuai untuk StopAssetEditing
untuk membuat Basis Data Aset melanjutkan perilaku normal dari perubahan pemrosesan otomatis.
Ini karena fungsi-fungsi ini meningkatkan dan mengurangi counter, daripada bertindak sebagai sakelar on / off sederhana. Memanggil StartAssetEditing
meningkatkan counter, dan memanggil StopAssetEditing
decrements counter. Aset Database melanjutkan perilaku normal ketika counter mencapai nol.
Alasan Unity menggunakan counter daripada boolean on/off sederhana sehingga jika kode Anda mengeksekusi beberapa pasangan “start” dan “stop”, pasangan dalam tidak sengaja menonaktifkan perilaku normal Aset Database terlalu awal. Alih-alih, setiap increments pasangan dan decrements counter oleh satu, dan jika kode Anda benar bersarang, panggilan luar akhir ke StopAssetEditing
menetapkan counter ke nol.
Sitemap Kode Anda tidak boleh menyebabkan penghitung ke bawah nol. Melakukan sehingga menghasilkan kesalahan.Note: Your code should never cause the counter to go below zero. Doing so generates an error.
Contoh berikut menunjukkan cara yang disarankan untuk menggunakan metode ini:
using UnityEditor;
public class StartStopAssetEditingExample : MonoBehaviour
{
[MenuItem("APIExamples/StartStopAssetEditing")]
static void CallAssetDatabaseAPIsBetweenStartStopAssetEditing()
{
try
{
//Place the Asset Database in a state where
//importing is suspended for most APIs
AssetDatabase.StartAssetEditing();
AssetDatabase.CopyAsset("Assets/Asset1.txt", "Assets/Text/Asset1.txt");
AssetDatabase.MoveAsset("Assets/Asset2.txt", "Assets/Text/Asset2.txt");
AssetDatabase.DeleteAsset("Assets/Asset3.txt");
}
finally
{
//Adding a call to StopAssetEditing inside
//a "finally" block ensures that the AssetDatabase
//state will be reset when leaving this function
AssetDatabase.StopAssetEditing();
}
}
}
Ketika Anda memanggil AssetDatabase.StartAssetEditing
, Unity menempatkan seluruh Aset Editor dalam database keadaan jeda. Seperti itu, jika Anda tidak membuat panggilan yang sesuai ke AssetDatabase. StopAssetEditing
, Editor tampaknya tidak responsif ketika datang ke operasi terkait aset (Importing, Refreshing, dll), dan memerlukan restart Editor untuk mengembalikan operasi normal.
Tanpa menggunakan blok try
... finally
, jika kode Anda yang memodifikasi Aset menyebabkan kesalahan, itu mungkin mencegah StopAssetEditing
dari yang disebut. Untuk menghindari situasi ini, bungkus panggilan di dalam... blok try
, dengan finally
, dan kode modifikasi Aset Anda di blok StartAssetEditing
, dan panggilan try
ditempatkan di blok StopAssetEditing
. Ini memastikan bahwa jika ada pengecualian terjadi ketika perubahan Anda dibuat di blok finally
, masih dijamin bahwa try
akan disebut.AssetDatabase.StopAssetEditing
will be called.