Jump to content
Unity Insider Forum

Singleton , sinvoll oder eher nicht ?


Fujikatoma

Recommended Posts

Hallo,

ich möchte mal nach langer zeit wieder was mit Unity machen und vorher alles etwas besser Planen.

Aktuell beschäftige ich mich damit wie ich alles aufbaue , Strukturen usw.

 

Ich nutze gerne Singleton's für verschiedene Sachen , spontan in denn sinn kommen mir da

-Datenbank Manager (Überlege noch ob NoSQL oder Json o.ä.)

-Sound Manager

-Server Manager

-Game Manager

 

Vermutlich werde da auch noch welche dazu kommen da ich ein Modulares Spiel bauen möchte und da noch den ein oder anderen Manager brauche

 

allerdings gibt es ja verschiedene implementationen. Aktuell habe ich diese hier :

 

using UnityEngine;
using System.Collections;
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;
private static object _lock = new object();
private static bool applicationIsQuitting = false;
public static T Instance
{
 get
 {
  if (applicationIsQuitting) {
   Debug.LogWarning("[singleton] Instance '"+ typeof(T) +
 "' already destroyed on application quit." +
 " Won't create again - returning null.");
   return null;
  }
  lock(_lock)
  {
   if (_instance == null)
   {
 _instance = (T) FindObjectOfType(typeof(T));
 if ( FindObjectsOfType(typeof(T)).Length > 1 )
 {
  Debug.LogError("[singleton] Something went really wrong " +
   " - there should never be more than 1 singleton!" +
   " Reopenning the scene might fix it.");
  return _instance;
 }
 if (_instance == null)
 {
  GameObject singleton = new GameObject();
  _instance = singleton.AddComponent<T>();
  singleton.name = "(singleton) "+ typeof(T).ToString();
  DontDestroyOnLoad(singleton);
  Debug.Log("[singleton] An instance of " + typeof(T) +
   " is needed in the scene, so '" + singleton +
   "' was created with DontDestroyOnLoad.");
 } else {
  Debug.Log("[singleton] Using instance already created: " +
   _instance.gameObject.name);
 }
   }
   return _instance;
  }
 }
}
public void OnDestroy () {
 applicationIsQuitting = true;
}
}

 

Ist diese Sinnvoll ? Ich habe bisher noch keinen Singleton im zusammenhang mit Gameobjects benutzt und bin mir da noch nicht ganz sicher.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da würde ich dann aber lieber eigene Klassen als Singletons definieren und nicht eine generische Klasse die Singletons erzeugt. Der Code ist im Endeffekt der gleiche, nur dass du den generischen Typ heraus nimmst und durch deine eigene MonoBehaviour-Klasse ersetzt.

 

Würdest du den generell zum Singleton oder eher davon abraten ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Unity-typische Singletons sind sowieso nicht genau dasselbe wie "normale" Singletons.

In Java z.B. sind Singletons irgendwie Käse weil man auch alles in einem statischen Kontext machen könnte. Wobei die Gang of Four bestimmt noch andere Argumente dagegen hatte.

In Unity jedenfalls brauchst du, wenn etwas in der Szene sein soll, ein nicht-statisches Objekt in der Szene. Wenn dieses einzigartig sein und entsprechende Vorteile bieten soll, machste halt ein Singleton draus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Genau so wie Sascha sagte, wenn das Script einzigartig in der Scene ist, dann kann man sehr gut mit Singletons arbeiten. Ich habe zwar schon oft Beschwerden über schweres Debugging von Singletonproblemen gehört selbst aber in der Praxis nie erlebt und benutze Singletons immer in meinen Projekten.

 

Diese Pattern was du da hast brauchst du eigentlich nicht wenn du selbst aufpasst, dass die Singletons nur einmal als Instance instantiated werden und dann nirgendswo eine zweite Instance in dem Project ist.

 

Was du brauchst ist einfach nur:

public class MyClass: MonoBehaviour {
  public static MyClass _instance;

  void Awake(){
   _instance = this;
   DontDestroyOnLoad(this);
  }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...