Xây dựng hệ thống Event trong Unity

26 Tháng sáu, 2024
(1 đánh giá)

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 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.

Setup scene demo
Setup scene demo

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.

Tạo EventManager
Tạo EventManager
Gán IconObject.cs vào ba gameobject
Gán IconObject.cs vào ba gameobject
Setup button Show
Setup button Show
Tương tự với button Hide
Tương tự với button Hide
Chạy test
Chạy test

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!

guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Tin tức liên quan
Hướng dẫn tạo sản phẩm Woocommerce có biến thể đẹp mắt
Mình đọc bình luận thấy khá nhiều bạn kêu gặp khó khăn trong vấn đề tạo sản phẩm có biến thể, hay sản phẩm có biến thể không được...
Hướng dẫn lấy đường dẫn các page Woocommerce 3.x
Chắc hẳn ai dùng Woocommerce đều sẽ muốn hiển thị đường dẫn của trang tài khoản, cửa hàng, thanh toán, giỏ hàng,.. Có rất nhiều phương án xử lý...
Hướng dẫn thêm Confirm Password trong Registration Page và Checkout Page
Tình trạng spam tài khoản, hay khách hàng không nghiêm túc trong việc tạo tài khoản để spam đơn hàng. Mình khuyến khích các bạn thêm một field nhập...