Mit einem Singleton in Unity3D

Ich bin derzeit versucht, ein Singleton als Globale Datenstruktur, die für die Aufgabe, die Organisation in einem Spiel, das ich mache in der Einheit.

Meiner Singleton-Klasse code ist wie folgt:

public class TaskManager : MonoBehaviour 
{
    private List<Task> Tasks;

    private static TaskManager instance;
    private TaskManager() 
    {
        Tasks = new List<Task>();
    }

    public static TaskManager Instance
    {
        get
        {
            if(instance == null)
            {
                instance = new TaskManager();
            }
            return instance;
        }
    }
}

Ich dieses Beispiel als Grundlage für meine Klasse:
https://msdn.microsoft.com/en-us/library/ff650316.aspx

Aber das problem ist, wenn ich versuche, Zugriff auf den TaskManager in verschiedenen Schriften, werden die Werte nicht gespeichert erhalten.

Zum Beispiel in einem script, das ich tun:

TaskManager tm = TaskManager.Instance;

Task newTask = new Task();
tm.PushTask(newTask);

print(tm.GetTaskList().Count);

Durch das ich sehen kann, dass der TaskManager hat einen Wert von 1, zeigt die neue Aufgabe.

Aber dann meine anderen Skript zu Lesen versucht, aus dem TaskManager:

TaskManager tm = TaskManager.Instance;
List<Task> l = tm.GetTaskList();
print(l.Count);

Wenn ich dies mache, wird die Anzahl zurückgegeben 0, die zeigen, dass die oben angegebene Aufgabe aus dem die Welt wurde nicht gerettet, um den TaskManager.

Ich bin mir ziemlich sicher, dass die Fehler, die aus mir Unverständnis, wie Singletons verwenden. Brauche ich zur Umsetzung ein set-property für die TaskManager-Instanz? Oder gibt es einen anderen Fehler, den ich mache?

Dank!

Edit:

Den PushTask () - code ist wie folgt:

public void PushTask(Task t)
{
    Tasks.Add(t);
}
  • Können Sie PushTask() Methode code?
  • Sichere Sache. Ich habe es am Ende.
  • Das singleton ist ok, also muss das problem irgendwo anders sein. Nach diese Lösung, markieren Sie die singleton-Klasse mit DontDestroyOnLoad wenn Sie wechselnden Szenen und wollen, um alle Daten in der statischen Instanz.
  • Hmm ich bin mir nicht wechselnden Szenen. Es ist die gleiche Szene, nur der Zugriff über verschiedene Skripts.
  • Es funktioniert noch auftreten, wenn Sie direkt auf Instance in beiden Fällen statt der Zuweisung an eine neue variable?
  • Eigentlich, wenn Sie wollen einfach nur ein singleton sollte man nicht Erben MonoBehaviour wenn Sie es brauchen werden, um ein Objekt in der Szene (zum Beispiel laufen auf Aktualisieren), müssen Sie erstellen eine GameObject, legen Sie es auf DontDestroyOnLoad und fügen Sie Ihre Instanz als Komponente zu. Sie sollten nicht new SomeComponent(), Einheit verarbeitet Komponenten (und UnityEngine.Object im Allgemeinen) anders, und es werde über Ihre Speicher-management.
  • Ich habe dieses tutorial unitygeek.com/unity_c_singleton, das sehr gut erklärt darüber, wie zu implementieren singleton in unity3d . Ich hoffe es ist nützlich

InformationsquelleAutor Jestus | 2015-02-28
Schreibe einen Kommentar