Unity 3D Одинак (Singleton)

2075 / Unity / 2D / 3D / Шаблони / Одинак (Singleton)

 

Плюси

Коли хочеться позбутися пошуку, або додавання посилання через редактор

Багаторазовий доступ до центрального скрипта

Перекидання об'єкту в іншу сцену з видаленням дубліката (який там є)

Мінуси

Зайві статичні змінні не дають можливість в майбутньому підміняти код одинака на інший (не дає впроваджувати залежності)

Продавець морозива, як і менеджер, тепер теж може звільнити вашого гравця з роботи

 



 

 
  
Гравець

public class Player : MonoBehaviour
{
  public static Player Singleton { get; private set; }

  void Awake()
  {
    Singleton = this;
  }
}

 

Кожен монстр

public class Enemy : MonoBehaviour
{
  Transform target;

  void Start()
  {
    target = Player.Singleton.transform;
  }
}
  

 При зміні сцени, посилання на об'єкт пропаде, через видалення об'єкту
 В наступній сцені треба знову прив'язати новий об'єкт
 Новий об'єкт не пам'ятатиме свою позицію та інші поля з минулого рівня
 
   

  
Якщо це контролер, який не видаляється при завантаженні нової сцени
Ще й видаляє дублікати. Справжній одинак!


public class GameController : MonoBehaviour { 
  public static GameController Singleton { get; private set; } 
 
  void Awake() { 
    if (!Singleton)
    {
      Singleton = this;
      DontDestroyOnLoad(this);
    }
    else
    {
      Destroy(gameObject);
    }     
  } 
}


  • Якщо видалити батька, діти не зможуть передатися в наступну сцену
  • Singleton ще називають антипатерном, бо доступ всіх до тебе – порушує принцип інкапсуляції
  • Лише після того, як проект стене складнішим – буде зрозуміло, чи це було гарне рішення