Singleton trong Unity
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 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