¿Dónde adjuntar scripts globales en Unity?

14

Hasta donde yo sé en Unity, cada script debe estar adjunto a un objeto. Pero, ¿cuál es el caso con los scripts globales? Por ejemplo, en un juego tipo tetris, ¿a qué objeto debo adjuntar los scripts de elemento generador y generador? ¿O debería un elemento manejar su movimiento por sí mismo? ¿Hay alguna mejor práctica para este problema?

nosferat
fuente

Respuestas:

14

Para ampliar la respuesta de Tetrad, considere un script como este:

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

Luego puede crear un objeto llamado "GameSystem" en la raíz de su escena. Los únicos componentes que tendría serían el componente de transformación incorporado (establezca su posición en el origen, su rotación en identidad y su escala en uno; no es que importe, pero es una buena práctica). Adjuntó el componente GameSystem a ese objeto.

Ahora puede acceder a su objeto global simplemente usando GameSystem.Instance.blah (). Unity invoca automáticamente sus métodos de controlador de eventos, ya que deriva de MonoBehavior y existe como componente. Puede agregarle campos que hagan referencia a otros objetos o componentes del juego y conectarlos en la vista de jerarquía de objetos de Unity.

Sí, todo esto es un poco "extraño". Puede sentirse un poco sucio tener que crear un objeto (que incluso tiene una transformación) que siempre es solo un singleton global. Sin embargo, es lo que Unity requiere para crear objetos globales que reciben un mensaje de actualización y son manipulables con el editor de propiedades predeterminado de Unity.

Sean Middleditch
fuente
Gracias por esta respuesta Estoy de acuerdo en que se siente raro! y creo que hay muy poca información sobre este lado de las cosas. ¿Tal vez podría recomendar algunos materiales de lectura sobre la mejor manera de abordar estas clases de tipo 'gerente' en unidad?
UpTheCreek
@UpTheCreek: Realmente no sé nada. La mayoría de las veces lo descubrimos todo en el trabajo hace un par de años, pero nuestros proyectos actuales están en tecnología personalizada, así que estoy bastante desactualizado con las mejores prácticas de Unity en estos días. Lo siento.
Sean Middleditch
3

Simplemente cree un objeto de administrador en el que ponga ese script. Tal vez haga una variable estática para esa secuencia de comandos que asigne Awakepara que tenga acceso global fácil a ella.

Tétrada
fuente