Onde anexar scripts globais no Unity?

14

Tanto quanto sei no Unity, todo script deve ser anexado a um objeto. Mas qual é o caso dos scripts globais? Por exemplo, em um jogo semelhante ao tetris, a qual objeto devo anexar os scripts spawner e mover do elemento? Ou o elemento deve lidar com seu movimento por si mesmo? Existe alguma prática recomendada para esse problema?

nosferat
fonte

Respostas:

14

Para expandir a resposta do Tetrad, considere um 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.
}

Você pode criar um objeto chamado "GameSystem" na raiz da sua cena. Os únicos componentes que ele teria seriam o componente de transformação interno (defina sua posição para a origem, sua rotação para identidade e sua escala para um; não que isso importe, mas seja uma boa prática). Anexado o componente GameSystem a esse objeto.

Agora você pode acessar seu objeto global usando simplesmente GameSystem.Instance.blah (). Seus métodos de manipulador de eventos são invocados automaticamente pelo Unity, pois deriva do MonoBehavior e existe como um componente. Você pode adicionar campos a ele que façam referência a outros objetos ou componentes do jogo e conectá-los na exibição da hierarquia de objetos do Unity.

Sim, tudo isso é um pouco "estranho". Pode parecer um pouco sujo ter que criar um objeto (que até tenha uma transformação) que é sempre apenas um singleton global. É o que o Unity exige para criar objetos globais que recebem uma mensagem de Atualização e são manipuláveis ​​com o editor de propriedades padrão do Unity.

Sean Middleditch
fonte
Obrigado por esta resposta. Concordo que parece estranho! e acho que há muito pouca informação nesse lado das coisas. Você poderia recomendar alguns materiais de leitura sobre a melhor forma de abordar essas classes do tipo "gerente" na unidade?
UpTheCreek
@UpTheCreek: Eu realmente não conheço nenhum. Nós descobrimos tudo isso no trabalho há alguns anos, mas nossos projetos atuais são sobre tecnologia personalizada, então estou bastante desatualizado com as melhores práticas da Unity atualmente. Desculpe.
21715
3

Basta criar um objeto gerenciador no qual você colocou esse script. Talvez faça uma variável estática para esse script ao qual você atribui, Awakepara ter fácil acesso global a ele.

Tetrad
fonte