Singleton trong Unity

25 Tháng sáu, 2024
(2 đánh giá)

Nếu phải chỉ ra một design pattern nào không thể thiếu trong một project thì đó chắc chắn là Singleton. Đơn giản, tính ứng dụng cao là các ưu điểm dễ dàng nhận thấy của pattern này. Do vậy, bài viết này mình sẽ giới thiệu với các bạn về Singleton.

Singleton Pattern trong Unity

Singleton Pattern là một pattern khá quen thuộc và phổ biến trong thiết kế phần mềm và trò chơi. Do đó việc tìm các khái niệm về singleton rất đơn giản và chính xác. Vậy nên mình sẽ không đề cập đến khái niệm nó là gì trong bài viết này mà sẽ tập trung vào công dụng của nó trong Unity.

Trong một trò chơi, phải ít nhất có một object mang nhiệm vụ quản lý xuyên suốt gameplay. Việc có bao nhiêu object mang nhiệm vụ quản lý tuỳ thuộc vào số lượng công việc cần xử lý trong game. Để các lớp quản lý này hoạt động được trơn tru thì bản thân nó cũng đặt ra khá nhiều yêu cầu:

  • Chỉ khơi tạo một lần xuyên xuốt quá trình chơi.
  • Có thể truy cập tại mọi lớp.
  • Hỗ trợ interface.
  • Cho phép kế thừa.

Để có thể đáp ứng được cái yêu cầu như trên, Singleton đã ra đời.

Singleton trong Unity
Singleton trong Unity

Singleton C# Unity

Singleton rất đơn giản và dễ dùng. Các bạn chỉ cần một script Singleton.cs như dưới đây:

using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType(typeof(T)) as T;
                if (instance == null)
                {
                    instance = new GameObject().AddComponent<T>();
                    instance.gameObject.name = instance.GetType().Name;
                }
            }
            return instance;
        }
    }
    public void Reset()
    {
        instance = null;
    }
    public static bool Exists()
    {
        return (instance != null);
    }
}

Đối với các lớp quản lý bạn muốn nó là một Singleton, hãy làm tương tự dưới đây:

public class GameManager: Singleton<GameManager>
{
    public void Test()
    {
        
    }
}

Nếu bạn muốn truy cập, gọi hàm của một lớp Singleton tại bất kì đâu ngoài lớp đó.

 GameController.Instance.Test();

Kết Luận

Sử dụng Singleton đem lại rất nhiều lợi ích cho lập trình viên. Chính vì vậy, có rất nhiều tranh cãi xảy ra về việc sử dụng quá lạm dụng Singleton. Tuy vậy, nó vẫn là một design pattern không thể thiếu đối với mình. Để tránh việc lạm dụng, hãy luôn xác định kĩ công việc, đặc tính của class mà bạn có ý định

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 xóa san-pham , danh-muc-san-pham trong đường dẫn sản phẩm Woocommerce
Với mặc định của Woocommerce, chi tiết sản phẩm sẽ có dạng domain/san-pham/ten-san-pham và danh mục sản phẩm sẽ ở dạng domain/danh-muc-san-pham/ten-danh-muc. Một phần đường dẫn như vậy sẽ...
Custom Plus & Minus Quantity trong Woocommerce
Như bạn đã biết thì nút thay đổi số lượng của Woocommerce để default không mấy là đẹp mắt và khiến người dùng khó tương tác trong việc thay...