Tôi đã thấy một số video và hướng dẫn để tạo các đối tượng singleton trong Unity, chủ yếu là cho a GameManager
, dường như sử dụng các cách tiếp cận khác nhau để khởi tạo và xác thực một singleton.
Có một cách tiếp cận chính xác, hay đúng hơn, ưa thích cho điều này?
Hai ví dụ chính tôi đã gặp là:
Đầu tiên
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
_instance = GameObject.FindObjectOfType<GameManager>();
}
return _instance;
}
}
void Awake()
{
DontDestroyOnLoad(gameObject);
}
}
Thứ hai
public class GameManager
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if(_instance == null)
{
instance = new GameObject("Game Manager");
instance.AddComponent<GameManager>();
}
return _instance;
}
}
void Awake()
{
_instance = this;
}
}
Sự khác biệt chính tôi có thể thấy giữa hai là:
Cách tiếp cận đầu tiên sẽ cố gắng điều hướng ngăn xếp đối tượng trò chơi để tìm một thể hiện của GameManager
điều đó mặc dù điều này chỉ xảy ra (hoặc chỉ nên xảy ra) một lần có vẻ như nó có thể không được đánh giá cao khi các cảnh tăng kích thước trong quá trình phát triển.
Ngoài ra, cách tiếp cận đầu tiên đánh dấu đối tượng không bị xóa khi ứng dụng thay đổi cảnh, điều này đảm bảo rằng đối tượng được duy trì giữa các cảnh. Cách tiếp cận thứ hai dường như không tuân thủ điều này.
Cách tiếp cận thứ hai có vẻ kỳ lạ như trong trường hợp cá thể là null trong getter, nó sẽ tạo ra một GameObject mới và gán một thành phần GameManger cho nó. Tuy nhiên, điều này không thể chạy mà không có thành phần GameManager đầu tiên được gắn vào một đối tượng trong cảnh, vì vậy điều này gây cho tôi một số nhầm lẫn.
Có cách tiếp cận nào khác sẽ được đề xuất, hoặc kết hợp cả hai cách trên không? Có rất nhiều video và hướng dẫn về singletons nhưng tất cả chúng đều khác nhau đến mức khó có thể đưa ra bất kỳ so sánh nào giữa hai và do đó, một kết luận về cách nào là cách tiếp cận tốt nhất / ưa thích.
GameManager
nên làm, hơn là làm thế nào để đảm bảo chỉ có một trường hợp của đối tượng và cách tốt nhất để thực thi điều đó.