Những điều cần biết về WaitUntil và WaitWhile trong Unity

Chào các bạn hôm nay mình xin trở lại để chia sẻ cho các bạn về một chút kiến thúc mình vừa mới update được. Đó là về WaitUntil và WaitWhile trong Unity. Mục tiêu là giúp các bạn hiểu biết thêm về 2 cái trên để áp dụng vô thực tế 1 cách dễ dàng hơn. Bài viết này được mình dịch lại từ http://www.theappguruz.com/blog/the-mystery-of-waituntil-waitwhile-in-unity-5-3-revealed Oke giới thiệu đã xong, mình xin đi vào bài 😄

I, WaitUntil là cái gì? Theo định nghĩa, nó cho tiếp tục hành động của mình được thực hiện khi điều kiện vẫn bằng true. Nói cách khác, nó cách khác là nó sẽ không tiếp tục thực hiện hành động nếu điều kiện bằng false và Unity sẽ cho đến khi điều kiện được bằng true mới thực hiện hành động.

Mình sẽ đi vào ví dụ để giúp bạn hiểu hơn về WaitUnitl: Giả sử bạn đang code game về đua xe. Bạn cần 1 cái notification đến cho Player khi chiếc xe hết nhiên liệu 1 cách sớm nhất có thể.

using UnityEngine;
using System.Collections;
public class Demo : MonoBehaviour {
public int counter;
void Start() {
counter = 20;
StartCoroutine(FuelNotification());
}

IEnumerator FuelNotification() {
Debug.Log("Waiting for tank to get empty");
yield return new WaitUntil(()=> counter <= 0);
Debug.Log("Tank Empty!"); //Notification
}
void Update() {
if (counter > 0)
{
Debug.Log("Fuel Level: " + counter);
counter--;
}
}
}

Và ta được kết quả như hình:

Ta thấy cấu trúc của WaitUnitl là WaitUntil(Func<bool> predicate); Trong ngoặc là Lambda expression. Ở đây ta có thể sửa code lại.

using UnityEngine;
using System.Collections;
public class Demo : MonoBehaviour {
    public int counter;
    void Start() {
        counter = 20;
        StartCoroutine(FuelNotification());
    }
    IEnumerator FuelNotification() {
        Debug.Log("Waiting for tank to get empty");
        yield return new WaitUntil(IsTankEmpty);
        Debug.Log("Tank Empty!");
    }
    void Update() {
        if (counter > 0)
        {
            Debug.Log("Fuel Level: " + counter);
            counter--;
        }
    }
    public bool IsTankEmpty(){
        if(counter>0){ return false; }
        else { return true; }
    }
}

II, Phần còn lại tìm hiểu WaitWhile Điều đầu tiên, WaitWhile là sự đối lập của WaitUntil. Nó sẽ được cho điều kiện false rồi mới thực hiện hành động tiếp theo.

Ta đi vào demo tí

using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
	public int counter;
	void Start() {
		counter = 10;
		StartCoroutine(FuelNotification());
	}

	IEnumerator FuelNotification() {
		Debug.Log("Waiting for tank to get empty");
		yield return new WaitWhile(()=> counter > 0);
		Debug.Log("Tank Empty!");
	}
	void Update() {
		if (counter > 0)
		{
			Debug.Log("Fuel Level: " + counter);
			counter--;
		}
	}
} 

Ta được kết quả như hình

Thật đơn giản về 2 cái này đúng không các bạn. Mình mong những gì mình sẻ hửu ích đối với bạn. Cảm ơn vì đã đến đây. Mình xin kết thúc bài tại đây ^^!