Di mana harus melampirkan skrip global di Unity?

14

Sejauh Iknow di Unity, setiap skrip harus dilampirkan ke objek. Tapi apa masalahnya dengan skrip global? Misalnya dalam permainan seperti tetris ke objek mana saya harus melampirkan elemen spawner dan skrip penggerak? Atau haruskah elemen menangani pergerakannya sendiri? Apakah ada praktik terbaik untuk masalah ini?

nosferat
sumber

Jawaban:

14

Untuk memperluas jawaban Tetrad, pertimbangkan skrip seperti ini:

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

Anda kemudian dapat membuat objek yang disebut "GameSystem" di root adegan Anda. Satu-satunya komponen yang dimilikinya adalah komponen transformasi bawaan (atur posisinya ke asal, rotasi ke identitas, dan skalanya menjadi satu; bukan itu yang penting, tapi itu praktik yang baik). Terlampir komponen GameSystem ke objek itu.

Anda sekarang dapat mengakses objek global Anda hanya dengan menggunakan GameSystem.Instance.blah (). Metode event handler dipanggil secara otomatis oleh Unity karena berasal dari MonoBehavior dan ada sebagai komponen. Anda bisa menambahkan bidang yang merujuk objek atau komponen game lain dan menghubungkannya dalam tampilan hierarki objek Persatuan.

Ya, ini semua sedikit "aneh." Rasanya sedikit kotor karena harus membuat objek (yang bahkan memiliki transformasi) yang selalu merupakan singleton global. Itulah yang dibutuhkan Unity untuk membuat objek global yang mendapatkan pesan Pembaruan dan dapat dimanipulasi dengan editor properti Unity default.

Sean Middleditch
sumber
Terima kasih atas jawaban ini. Saya setuju rasanya aneh! dan berpikir ada sangat sedikit info di luar sana di sisi ini. Bisakah Anda merekomendasikan beberapa bahan bacaan tentang cara terbaik untuk mendekati kelas tipe 'manajer' ini dalam persatuan?
UpTheCreek
@UpTheCreek: Saya tidak benar-benar tahu. Kami sebagian besar mengatasinya semua pada pekerjaan beberapa tahun yang lalu, tetapi proyek kami saat ini adalah pada teknologi kustom jadi saya cukup ketinggalan zaman dengan praktik terbaik Unity hari ini. Maaf.
Sean Middleditch
3

Cukup buat objek manajer tempat Anda meletakkan skrip itu. Mungkin membuat variabel statis untuk skrip yang Anda tetapkan Awakesehingga Anda memiliki akses global yang mudah ke sana.

Tetrad
sumber