Ізоляція та контроль: Роль сінглтона в архітектурі ігор

Патерн проектування Singleton є одним з важливих інструментів у програмуванні, що забезпечує наявність лише одного екземпляра класу та надає глобальний доступ до цього екземпляра. Це корисно в ситуаціях, коли потрібно обмежити кількість об'єктів класу до одного, як, наприклад, у класах-менеджерах — AudioManager, InputManager або DBConnectionManager, що виконують важливі функції протягом усього проекту. Вони можуть бути доступні з будь-якої частини гри, зберігаючи лише один екземпляр під час виконання.

Патерн Singleton сприяє ефективному управлінню ресурсами та забезпечує стабільну поведінку програми, гарантуючи, що існує лише один екземпляр класу. Однак, питання його використання викликає багато обговорень серед розробників, оскільки його переваги та недоліки залежать від конкретного проекту.

Існують два основні способи реалізації цього патерну: перевірка Singleton в кожному класі та використання загального базового класу Singleton.

У першому випадку кожен клас самостійно перевіряє, чи є вже екземпляр Singleton, і лише один раз створює його в методі Awake. Це дозволяє зберігати лише один екземпляр класу, наприклад:

public class AudioManager : MonoBehaviour {  

 public static AudioManager _instance {get; private set;}  

 private void Awake() {  
 // перевірка на єдиний екземпляр  
 if(_instance == null)  
 _instance = this;  
 else  
 Destroy(this.gameobject);  
 }  

 public void PlayAudio(AudioClip _clip) {  
 // Відтворення аудіо  
 }  
}

Цей підхід дозволяє створювати екземпляри класів, таких як InputManager та DBConnectionManager, застосовуючи аналогічну перевірку.

Другий підхід полягає в використанні загального базового класу, що дозволяє спростити код і уникнути повторення перевірок для кожного класу. Ось як виглядає реалізація такого базового класу:

public class Singleton : MonoBehaviour where T : Singleton {  
 private static T _instance {get; private set;}  

 private void Awake() {  
 if (_instance == null) {  
 instance = this as T;  
 DontDestroyOnLoad(this );  
 } else {  
 Destroy(this);  
 }  
 }  
}

Завдяки цьому, інші класи, такі як AudioManager, InputManager, і DBConnectionManager, можуть легко стати сінглтонами без необхідності додаткових перевірок, що значно спрощує код:

public class AudioManager : Singleton {  
 public void PlayAudio(AudioClip _clip) {  
 // Відтворення аудіо  
 }  
}  

public class InputManager : Singleton {  
 // Код для InputManager  
}  

public class DBConnectionManager : Singleton {  
 // Код для DBConnectionManager  
}

Тепер ці класи можна використовувати з будь-якої частини проекту, звертаючись до них через статичну змінну _instance.

У книзі Learning Game Architecture with Unity більш детально пояснюється використання патернів проектування у контексті розробки ігор, і вона доступна на різних платформах, таких як Amazon.

Перекладено з: Isolate and Control: The Singleton’s Role in Game Architecture