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

26 Tháng Sáu, 2024

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!

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
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
Command Pattern và ứng dụng trong Unity – Phần 1
Trong lập trình game, việc tương tác, điều khiển của người chơi với game là rất quan trọng. Do vậy, command pattern được sử dụng rộng rãi và phổ...
Hitbox và Hurtbox trong Unity3D
Phàm từ xưa đến nay, nhiều chuyện nghĩ thì đơn giản nhưng lúc bắt tay vào làm thì gặp rất nhiều vấn đề đau đầu. Ví dụ khi một...
Các hàm cơ bản của Monobehaviour Unity: Awake, OnEnable, Start
Monobehaviour là một lớp “nền” cho các script được gắn vào game object trong Unity. Một lớp Mono có sẵn rất nhiều hàm để thực thi các chức năng...
0
Rất thích suy nghĩ của bạn, hãy bình luận.x