Où joindre des scripts globaux dans Unity?

14

Autant que je sache dans Unity, chaque script doit être attaché à un objet. Mais quel est le cas avec les scripts globaux? Par exemple, dans un jeu de type tetris, à quel objet dois-je attacher les scripts de génération et de déplacement d'élément? Ou l'élément doit-il gérer lui-même son mouvement? Existe-t-il une meilleure pratique pour ce problème?

nosferat
la source

Réponses:

14

Pour développer la réponse de Tetrad, considérez un script comme celui-ci:

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.
}

Vous pouvez ensuite créer un objet appelé "GameSystem" à la racine de votre scène. Les seuls composants qu'il aurait seraient le composant de transformation intégré (définissez sa position sur l'origine, sa rotation sur l'identité et son échelle sur un; ce n'est pas important, mais c'est une bonne pratique). Attaché le composant GameSystem à cet objet.

Vous pouvez maintenant accéder à votre objet global en utilisant simplement GameSystem.Instance.blah (). Ses méthodes de gestionnaire d'événements sont invoquées automatiquement par Unity car elles dérivent de MonoBehavior et existent en tant que composant. Vous pouvez y ajouter des champs qui font référence à d'autres objets ou composants de jeu et les connecter dans la vue de la hiérarchie des objets Unity.

Oui, tout cela est un peu "bizarre". Cela peut sembler un peu sale de devoir créer un objet (qui a même une transformation) qui n'est toujours qu'un singleton global. C'est ce dont Unity a besoin pour créer des objets globaux qui reçoivent un message de mise à jour et sont manipulables avec l'éditeur de propriétés Unity par défaut, cependant.

Sean Middleditch
la source
Merci pour cette réponse. Je suis d'accord, ça fait bizarre! et pense qu'il y a très peu d'informations sur ce côté des choses. Pourriez-vous peut-être recommander des documents de lecture sur la meilleure façon d'aborder ces classes de type «gestionnaire» dans l'unité?
UpTheCreek
@UpTheCreek: Je n'en connais pas vraiment. Nous avons surtout tout compris sur le tas il y a quelques années, mais nos projets actuels sont sur la technologie personnalisée, donc je ne suis pas à jour avec les meilleures pratiques d'Unity de nos jours. Pardon.
Sean Middleditch
3

Créez simplement un objet gestionnaire sur lequel vous mettez ce script. Créez peut-être une variable statique pour ce script que vous attribuez Awakeafin d'avoir un accès global facile à celui-ci.

Tetrad
la source