Nhật ký Ngày... Tháng.. Năm...
blank
Trang chủ » Nghiệp Code » Singleton là gì? Hiểu sao cho đúng Singleton

Singleton là gì? Hiểu sao cho đúng Singleton

blank
blank

Trong Unity mình hay dùng một kỹ thuật là Singleton để quản lý các đối tượng mà có kiểu duy nhất như mấy cái SoundManager, LockScene (khóa màn hình khi loading…), popup ThongBao… mấy thằng này có đặc điểm là 1 game thì chỉ cần 1 object duy nhất, có thể gọi từ bất cứ chỗ nào, thằng nào thích thì gọi. Singleton là một phương pháp lập trình trong đó đảm bảo việc khởi tạo đối tượng từ một class cho trước chỉ diễn ra một lần duy nhất trong toàn bộ quá trình chạy ứng dụng.

Một ví dụ đơn giản của singleton là PhysicEngine. Trong một Game Engine chỉ có duy nhất một Physic Engine chạy, nếu không Object sẽ không biết phải theo hướng dẫn của Engine nào. Bạn có thể kể tên một số singleton khác rất dễ thấy như là ScoreManager, LevelBuilder, PlayerController (trừ trường hợp game hỗ trợ nhiều người chơi trên cùng 1 máy) …

Với những thằng như EnergyCount (bộ đếm lượt chơi), NetworkManager,… thường có các thông số cần giữ lại, nên khi object mới của singleton được tạo ra nếu instance đã tồn tại nó sẽ hủy object mới

 

public class EnergyCount: MonoBehaviour
{ private static EnergyCount instance; public static EnergyCount Instance { get { return instance; } } //đảm bảo không set được chỉ get thôi void Awake() { if (instance != null) Destroy (this.gameObject); //đã có instance -> hủy object mới tạo else { instance = this; DontDestroyOnLoad (gameObject); } } protected void OnDestroy () { //Nhớ giải phóng vì đây là static if (Instance == this) { instance = null; } } //...
}

 

Với những đối tượng đơn giản kiểu popupThongBaoLockScene,… thì có thể tạo instance mới thay thế cho cái cũ

public class ThongBao: MonoBehaviour
{ private static ThongBao instance; public static ThongBao Instance { get { return instance; } } //đảm bảo không set được chỉ get thôi void Awake() { if (instance != null) Destroy (instance.gameObject); //hủy instance cũ nếu có instance = this; DontDestroyOnLoad (gameObject); } protected void OnDestroy () { //Nhớ giải phóng vì đây là static if (Instance == this) { instance = null; } } //...
}

blank

blank

Cương Phạm

blank

Thêm bình luận

blank