Koroutine memungkinkan Anda untuk menyebarkan tugas di beberapa bingkai. Dalam Unity, koroutine adalah metode yang dapat menghentikan eksekusi dan kembali kontrol ke Unity tetapi kemudian melanjutkan di mana kiri pada bingkai berikut.
Dalam kebanyakan situasi, ketika Anda memanggil metode, itu berjalan untuk menyelesaikan dan kemudian kembali kontrol ke metode panggilan, ditambah nilai pengembalian opsional. Ini berarti bahwa setiap tindakan yang terjadi dalam metode harus terjadi dalam pembaruan bingkai tunggal.
Dalam situasi di mana Anda ingin menggunakan metode panggilan untuk mengandung animasi prosedural atau urutan peristiwa seiring waktu, Anda dapat menggunakan koroutine.
Namun, penting untuk diingat bahwa koroutines tidak benang. Operasi sinkron yang berjalan dalam koroutine masih mengeksekusi pada benang utama. Jika Anda ingin mengurangi jumlah waktu CPU yang dihabiskan pada benang utama, itu hanya penting untuk menghindari operasi penyumbatan dalam koroutines seperti dalam kode skrip lainnya. Jika Anda ingin menggunakan kode berganda dalam Unity, pertimbangkan Sistem Pekerjaan C#.
Yang terbaik untuk menggunakan koroutines jika Anda perlu berurusan dengan operasi asinkron panjang, seperti menunggu transfer HTTP, beban aset, atau file I / O untuk menyelesaikan.
Sebagai contoh, pertimbangkan tugas secara bertahap mengurangi nilai alfa objek (opacity) sampai menjadi tidak terlihat:
void Fade()
{
Color c = renderer.material.color;
for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
{
c.a = alpha;
renderer.material.color = c;
}
}
Dalam contoh ini, metode Fade tidak memiliki efek yang mungkin Anda harapkan. Untuk membuat fading terlihat, Anda harus mengurangi alfa fade atas urutan bingkai untuk menampilkan nilai-nilai menengah yang render Unity. Namun, metode contoh ini mengeksekusi keseluruhannya dalam pembaruan bingkai tunggal. Nilai menengah tidak pernah ditampilkan, dan objek menghilang secara instan.
Untuk bekerja di sekitar situasi ini, Anda dapat menambahkan kode ke fungsi Update
yang mengeksekusi fade berdasarkan frame-by-frame. Namun, bisa lebih nyaman untuk menggunakan koroutine untuk tugas semacam ini.
Dalam C #, Anda menyatakan koroutine seperti ini:
IEnumerator Fade()
{
Color c = renderer.material.color;
for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
{
c.a = alpha;
renderer.material.color = c;
yield return null;
}
}
Koroutine adalah metode yang Anda deklarasikan dengan tipe pengembalian IEnumerator dan dengan pernyataan pengembalian yield termasuk suatu tempat di dalam tubuh. yield return null
line adalah titik di mana jeda eksekusi dan resume dalam bingkai berikut. Untuk mengatur berjalan koroutine, Anda perlu menggunakan fungsi StartCoroutine:
void Update()
{
if (Input.GetKeyDown("f"))
{
StartCoroutine(Fade());
}
}
Counter loop dalam fungsi Fade mempertahankan nilai yang benar selama seumur hidup koroutine, dan variabel atau parameter apa pun dipertahankan antara pernyataan yield
.
Secara default, Unity melanjutkan koroutine pada bingkai setelah pernyataan yield
. Jika Anda ingin memperkenalkan penundaan waktu, gunakan WaitForSeconds:
IEnumerator Fade()
{
Color c = renderer.material.color;
for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
{
c.a = alpha;
renderer.material.color = c;
yield return new WaitForSeconds(.1f);
}
}
Anda dapat menggunakan WaitForSeconds
untuk menyebarkan efek selama periode waktu, dan Anda dapat menggunakannya sebagai alternatif untuk termasuk tugas dalam metode Update
. Unity memanggil metode Update
beberapa kali per detik, jadi jika Anda tidak perlu tugas untuk diulang cukup begitu sering, Anda dapat menempatkannya dalam koroutine untuk mendapatkan pembaruan rutin tetapi tidak setiap bingkai tunggal.
Misalnya, Anda mungkin memiliki alarm dalam aplikasi Anda yang memperingatkan pemain jika musuh dekat dengan kode berikut:
bool ProximityCheck()
{
for (int i = 0; i < enemies.Length; i++)
{
if (Vector3.Distance(transform.position, enemies[i].transform.position) < dangerDistance) {
return true;
}
}
return false;
}
Jika ada banyak musuh kemudian memanggil fungsi ini setiap bingkai mungkin memperkenalkan overhead yang signifikan. Namun, Anda bisa menggunakan koroutine untuk menyebutnya setiap puluhan detik:
IEnumerator DoCheck()
{
for(;;)
{
if (ProximityCheck())
{
// Perform some action here
}
yield return new WaitForSeconds(.1f);
}
}
Ini mengurangi jumlah pemeriksaan yang dilakukan Unity tanpa efek yang terlihat pada gameplay.
Untuk menghentikan koroutine, gunakan StopCoroutine dan StopAllCoroutines. Koroutine juga berhenti jika Anda telah mengatur SetActive ke false
untuk menonaktifkan GameObjectObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary koroutine melekat. Memanggil Destroy(example)
(di mana example
adalah contoh MonoBehaviour
) segera memicu OnDisable dan Proses Unity koroutine, secara efektif menghentikannya. Akhirnya, OnDestroy
divoked pada akhir bingkai.
Sitemap Jika Anda telah menonaktifkan Note: dengan mengatur MonoBehaviour
ke enabled, Unity tidak menghentikan koroutines.false
, Unity doesn’t stop coroutines.
Koroutines mengeksekusi berbeda dari kode skrip lainnya. Kebanyakan kode skrip dalam Unity muncul dalam jejak kinerja di satu lokasi, selanbung panggilan tertentu. Namun, kode CPU koroutines selalu muncul di dua tempat di jejak.
Semua kode awal dalam koroutine, dari awal metode koroutine sampai pernyataan yield
pertama, muncul di jejak setiap Unity memulai koroutine. Kode awal paling sering muncul ketika metode StartCoroutine disebut. Koroutines bahwa callback Unity menghasilkan (seperti callback Start
yang kembali pertama kali muncul dalam callback Unity masing-masing.IEnumerator
) first appear within their respective Unity callback.
Sisa kode koroutine (dari pertama kalinya ia melanjutkan sampai selesai mengeksekusi) muncul dalam garis DelayedCallManager
yang berada di dalam loop utama Unity.
Hal ini terjadi karena cara yang menginisiasi koroutin. Audi BMW Chevrolet Citroen Dacia Fiat Ford Honda Hyundai Kia Mazda Mercedes Mitsubishi Nissan Opel Peugeot Renault Seat Skoda Subaru Suzuki Toyota Volkswagen Volvo Unity kemudian menggunakan objek ini untuk melacak keadaan koroutine di beberapa panggilan metode tunggal. Karena variabel cakupan lokal dalam koroutine harus bertahan di panggilan C# kompilacja, Unity mengangkat variabel cakupan lokal ke dalam kelas yang dihasilkan, yang tetap dialokasikan pada tumpahan selama koroutine. Objek ini juga melacak keadaan internal koroutine: itu ingat di mana titik dalam kode koroutine harus melanjutkan setelah menghasilkan.yield
calls, Unity hoists the local-scope variables into the generated class, which remain allocated on the heap during the coroutine. This object also tracks the internal state of the coroutine: it remembers at which point in the code the coroutine must resume after yielding.
Karena ini, tekanan memori yang terjadi ketika awal koroutine sama dengan alokasi overhead tetap ditambah ukuran variabel ruang lingkup lokal.
Kode yang memulai konstruksi koroutine dan memprovokasi objek, dan kemudian Unity DelayedCallManager
membentang lagi setiap kondisi koroutine yield
puas. Karena koroutines biasanya mulai di luar koroutin lain, ini membagi overhead eksekusi mereka antara panggilan yield
dan DelayedCallManager
.
Anda dapat menggunakan Unity ProfilerJendela yang membantu Anda untuk mengoptimalkan permainan Anda. Ini menunjukkan berapa banyak waktu yang dihabiskan di berbagai bidang permainan Anda. Sebagai contoh, dapat melaporkan persentase waktu yang dihabiskan rendering, aimating, atau dalam logika permainan Anda. More info
Lihat di Glossary untuk memeriksa dan memahami di mana Unity mengeksekusi koroutin dalam aplikasi Anda. Untuk melakukan ini, profil aplikasi Anda dengan Profil diaktifkan, profil mana setiap bagian dari kode skrip Anda dan mencatat semua panggilan fungsi. Anda kemudian dapat menggunakan Login Database untuk menyelidiki koroutin dalam aplikasi Anda.
Praktik terbaik untuk mengkondensasi serangkaian operasi ke sejumlah besar koroutin individu mungkin. Koroutine bersarang berguna untuk kejernihan kode dan pemeliharaan, tetapi mereka memaksakan overhead memori yang lebih tinggi karena benda-benda jejak koroutine.
Jika koroutine berjalan setiap bingkai dan tidak yield
pada operasi jangka panjang, lebih dilakukan untuk menggantikannya dengan callback Update
atau LateUpdate
. Ini berguna jika Anda memiliki koroutin yang panjang atau tak terbatas.