Gini IT-Chia sẻ kiến thức IT

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

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

361 lượt xem 14 Th7, 2019
0

Tutorial

6 bài viết

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.

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
Gán IconObject.cs vào ba gameobject
Setup button Show
Tương tự với button Hide
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.

Chạy test

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!

Leave a Reply

avatar
  Theo dõi  
Thông báo của

Bài viết liên quan