Wo können globale Skripte in Unity angehängt werden?

14

Soweit ich in Unity weiß, muss jedes Skript an ein Objekt angehängt werden. Aber wie sieht es mit globalen Skripten aus? Zum Beispiel in einem Tetris-ähnlichen Spiel, an welches Objekt soll ich das Element-Spawner- und Mover-Skript anhängen? Oder sollte das Element seine Bewegung für sich selbst handhaben? Gibt es eine bewährte Methode für dieses Problem?

nosferat
quelle

Antworten:

14

Betrachten Sie ein Skript wie das folgende, um die Antwort von Tetrad zu erweitern:

public class GameSystem : MonoBehavior
{
  private GameSystem m_Instance;
  public GameSystem Instance { get { return m_Instance; } }

  void Awake()
  {
    m_Instance = this;
  }

  void OnDestroy()
  {
    m_Instance = null;
  }

  void Update()
  {
    // global game update logic goes here
  }

  void OnGui()
  {
    // common GUI code goes here
  }

  // etc.
}

Sie können dann ein Objekt mit dem Namen "GameSystem" im Stammverzeichnis Ihrer Szene erstellen. Die einzige Komponente, die es hätte, wäre die eingebaute Transformationskomponente (setzen Sie ihre Position auf den Ursprung, ihre Rotation auf die Identität und ihre Skalierung auf eins; nicht, dass es darauf ankommt, aber es ist eine gute Praxis). Hängte die GameSystem-Komponente an dieses Objekt an.

Sie können jetzt auf Ihr globales Objekt zugreifen, indem Sie einfach GameSystem.Instance.blah () verwenden. Die Event-Handler-Methoden werden von Unity automatisch aufgerufen, da sie von MonoBehavior abgeleitet und als Komponente vorhanden sind. Sie können ihm Felder hinzufügen, die auf andere Spielobjekte oder -komponenten verweisen, und diese in der Unity-Objekthierarchie verbinden.

Ja, das ist alles ein bisschen "komisch". Es kann sich ein wenig schmutzig anfühlen, ein Objekt erstellen zu müssen (das sogar eine Transformation aufweist), das immer nur ein globaler Singleton ist. Es ist jedoch erforderlich, dass Unity globale Objekte erstellt, die eine Aktualisierungsnachricht erhalten und mit dem standardmäßigen Unity-Eigenschafteneditor bearbeitet werden können.

Sean Middleditch
quelle
Danke für diese Antwort. Ich stimme zu, es fühlt sich komisch an! und denke, es gibt sehr wenig Informationen da draußen auf dieser Seite der Dinge. Könnten Sie vielleicht einige Lesematerialien dazu empfehlen, wie Sie diese 'Manager'-Typklassen am besten in einer Einheit ansprechen können?
UpTheCreek
@UpTheCreek: Ich kenne keine wirklich. Wir haben es vor ein paar Jahren meistens bei der Arbeit herausgefunden, aber unsere aktuellen Projekte befassen sich mit kundenspezifischer Technologie. Daher bin ich heutzutage mit den Best Practices von Unity ziemlich veraltet. Es tut uns leid.
Sean Middleditch
3

Erstellen Sie einfach ein Manager-Objekt, in das Sie das Skript einfügen. Erstellen Sie möglicherweise eine statische Variable für das Skript, das Sie zuweisen, Awakedamit Sie einen einfachen globalen Zugriff darauf haben.

Tetrade
quelle