Gdzie dołączyć globalne skrypty do Unity?

14

O ile wiem w Unity, każdy skrypt musi być dołączony do obiektu. Ale co dzieje się z globalnymi skryptami? Na przykład w grze przypominającej tetris, do którego obiektu powinienem dołączyć skrypt spawnujący element i skrypt przemieszczający? A może element powinien sam sobie poradzić z ruchem? Czy istnieją jakieś najlepsze praktyki dotyczące tego problemu?

nosferat
źródło

Odpowiedzi:

14

Aby rozwinąć odpowiedź Tetrad, rozważ taki skrypt:

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

Następnie możesz utworzyć obiekt o nazwie „GameSystem” w katalogu głównym sceny. Jedynymi komponentami, jakie miałby, byłby wbudowany komponent transformacji (ustaw jego położenie na początek, jego obrót na tożsamość i jego skalę na jeden; nie, że to ma znaczenie, ale jest to dobra praktyka). Dołączono składnik GameSystem do tego obiektu.

Możesz teraz uzyskać dostęp do swojego obiektu globalnego za pomocą GameSystem.Instance.blah (). Metody obsługi zdarzeń są wywoływane automatycznie przez Unity, ponieważ wywodzi się z MonoBehavior i istnieje jako komponent. Możesz dodać do niego pola, które odnoszą się do innych obiektów lub komponentów gry i połączyć je w widoku hierarchii obiektów Unity.

Tak, to wszystko jest trochę „dziwne”. To może być trochę brudne, gdy trzeba stworzyć obiekt (który ma nawet transformację), który zawsze jest tylko globalnym singletonem. Tego właśnie wymaga Unity do tworzenia globalnych obiektów, które otrzymują komunikat o aktualizacji i można nimi manipulować za pomocą domyślnego edytora właściwości Unity.

Sean Middleditch
źródło
Dziękuję za tę odpowiedź. Zgadzam się, że to dziwne! i myślę, że po tej stronie rzeczy jest bardzo mało informacji. Czy mógłbyś polecić jakieś materiały do ​​czytania na temat tego, jak najlepiej podchodzić do tych klas typu „menedżerskiego” w jedności?
UpTheCreek,
@UpTheCreek: Tak naprawdę nie znam żadnego. Kilka lat temu przeszliśmy przez większość pracy, ale nasze obecne projekty dotyczą niestandardowych technologii, więc obecnie jestem dość nieaktualny, jeśli chodzi o najlepsze praktyki Unity. Przepraszam.
Sean Middleditch,
3

Po prostu utwórz obiekt menedżera, na którym umieścisz ten skrypt. Może stwórz zmienną statyczną dla skryptu, który przypisujesz, Awakeaby mieć łatwy globalny dostęp do niego.

Tetrad
źródło