Xây dựng hệ thống Event trong Unity
Trong quá trình game hoạt động, có những xử kiện có thể xảy ra. Khi đó, đòi hỏi một hoặc nhiều object liên quan phải thực thi các hành động tương ứng. Nếu chúng ta để các object giao tiếp trực tiếp với nhau sẽ gây rối, khó bảo trì code trong project.
Về cơ bản, hệ thống Event như một bảng tin. Trong đó, mỗi object có thể đăng kí các event với các hành động của nó. Khi các event xảy ra, các object đã đăng kí event đó sẽ thực thi các hành động tương ứng.
Trong bài viết này mình sẽ hướng dẫn các bạn xây dựng hệ thống event đơn giản dùng: Delegate hoặc UnityAction. Cụ thể, hệ thống event trong bài viết này là: ShowObject và HideObject. Khi đó các object sẽ hiện hoặc ẩn tương ứng với hai event.
Dưới đây là setup scene sẵn của mình, có ba object tương ứng với ba icon và hai button để gọi event.
Delegate
Delagate trong C# khá quen thuộc nên mình cũng không nói lại nó nữa.
Để bắt đầu mình sẽ tạo script EventManager.cs sẽ để quản lý và gọi các event. Mình sẽ cho nó là Singleton.
using UnityEngine;
public class EventManager : Singleton<EventManager>
{
public delegate void ShowObject();
public ShowObject OnShowObject;
public delegate void HideObjet();
public HideObjet OnHideObject;
public void Show()
{
if (OnShowObject != null)
{
OnShowObject();
}
}
public void Hide()
{
if (OnHideObject != null)
{
OnHideObject();
}
}
}
Lưu ý: Singleton là gì? Và tại sao mình lại sử dụng nó? Các bạn có thể xem tại đây.
Bước tiếp theo là tạo script cho các icon, đăng kí hai event có tại EventManager:
using UnityEngine;
public class IconObject : MonoBehaviour
{
void Start()
{
// Đăng kí event
EventManager.Instance.OnShowObject += Show;
EventManager.Instance.OnHideObject += Hide;
}
private void Show()
{
gameObject.SetActive(true);
}
private void Hide()
{
gameObject.SetActive(false);
}
}
Lưu ý: Toán tử “+=” ở đây dùng để đăng kí hàm tương ứng với event đó. Ngược lại, toán từ “-=” sẽ là loại bỏ hàm đó (nếu đã được đăng kí) khỏi event đó.
Bước cuối cùng là gán các script vừa viết vào gameobject và chạy test thôi.
OK, vậy là chúng ta đã thành công với Delegate.
UnityAction
Về cơ bản UnityAction cũng gần giống với Delagate. Sự khác biệt có lẽ đến ở phần khai báo. Để có một event với Delegate chúng ta cần khai báo hai dòng, trong khi đó UnityAction chỉ cần một dòng.
Các bước thực hiện vẫn y nguyên phần trên và thay đổi một chút script EventManager.cs và IconObject.cs.
using UnityEngine.Events;
public class EventManager : Singleton<EventManager>
{
public UnityAction ShowObject;
public UnityAction HideObject;
public void Show()
{
if (ShowObject != null)
{
ShowObject();
}
}
public void Hide()
{
if (HideObject != null)
{
HideObject();
}
}
}
using UnityEngine;
public class IconObject : MonoBehaviour
{
void Start()
{
// Đăng kí event
EventManager.Instance.ShowObject += Show;
EventManager.Instance.HideObject += Hide;
}
private void Show()
{
gameObject.SetActive(true);
}
private void Hide()
{
gameObject.SetActive(false);
}
}
Chạy test thử và kết qủa cho ra giống với dùng delegate.
Kết luận
Vậy là mình đã hướng dẫn xong cách xây dựng hệ thống event cơ bản. Tuy nhiên, với Delegate và UnityAction hoàn toàn có thể xây dựng được một hệ thống event phức tạp và ứng dụng nhiều hơn.
Chúc các bạn thành công!