Pelaksanaan Coroutine dan Pengambilan Nilai dalam Perpaduan
Dalam permainan Unity anda, anda menghadapi dilema: anda perlu mengembalikan nilai pembolehubah hanya selepas coroutine (WaitForRequest) telah selesai dilaksanakan. Walau bagaimanapun, penyataan pulangan dalam kaedah POST dijalankan sebelum coroutine selesai, mengakibatkan nilai pulangan yang salah.
Memahami Coroutine
Coroutine dalam Unity ialah fungsi yang digantung yang boleh dijeda dan disambung semula dari semasa ke semasa. Mereka membenarkan operasi tak segerak dilakukan tanpa menyekat benang utama. WaitForRequest coroutine bertanggungjawab mengemas kini pembolehubah success_fail berdasarkan respons HTTP.
Isu
Isu timbul daripada pelaksanaan serta-merta penyata pengembalian dalam POST kaedah. Ini berlaku sebelum coroutine mempunyai peluang untuk mengemas kini pembolehubah success_fail, mengakibatkan nilai pulangan pramatang dan salah.
Penyelesaian Menggunakan Tindakan
Untuk mengatasinya, anda boleh menggunakan perwakilan Tindakan, fungsi tanpa parameter yang menerima pembolehubah jenis int. Dengan menghantar Tindakan sebagai parameter kepada WaitForRequest coroutine, anda boleh menentukan fungsi panggil balik untuk digunakan apabila coroutine selesai.
Fungsi panggil balik yang disediakan oleh Action akan menerima nilai kemas kini success_fail dan anda boleh kemudian gunakannya untuk melakukan tindakan selanjutnya atau mengembalikan nilai seperti yang diperlukan.
Contoh Kod
Berikut ialah versi terkini kod anda yang menunjukkan penggunaan Tindakan:
public int POST(string username, string passw) { WWWWWForm form = new WWWForm(); form.AddField("usr", username); form.AddField("pass", passw); WWW www = new WWW(url, form); StartCoroutine(WaitForRequest(www, (status) => { success_fail = status; // Perform other actions or return the value as needed })); // This line is no longer returning a value // as the success_fail variable is being modified asynchronously } private IEnumerator WaitForRequest(WWW www, Action<int> callback) { yield return www; if (www.error == null) { if (www.text.Contains("user exists")) { callback(2); } else { callback(1); } } else { callback(0); } }
Dalam kod ini, kaedah POST tidak lagi mengembalikan nilai secara langsung. Sebaliknya, ia memulakan coroutine WaitForRequest, memberikan perwakilan Tindakan sebagai parameter. Tindakan akan dipanggil setelah coroutine selesai, membolehkan anda mengakses dan menggunakan pembolehubah success_fail yang dikemas kini.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengembalikan Nilai daripada Coroutine Perpaduan Selepas Ia Selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!