Saya membuat apa yang pada dasarnya adalah sistem cetakan saya sendiri. Objek game ditentukan oleh file data yang dapat dibaca manusia. Saya ingin membuat GameObject kosong, memuatnya dengan komponen yang ditentukan dalam file data dan membuatnya siap dan menunggu Instantiate()
panggilan. Namun, setiap kali saya menggunakan GameObject go = new GameObject()
objek game baru ditambahkan ke TKP.
Menggunakan Unity bawaan prefab, saya dapat memuat prefab sebagai GameObject, dan itu tidak ditambahkan ke adegan. (Lihat contoh di bawah)
Alasan di balik ini adalah saya ingin memiliki satu daftar yang berisi GameObjects, beberapa dihasilkan oleh memuat prefab Unity dan yang lainnya dibuat oleh sistem prefab kustom saya. Ini perlu terjadi pada saat run time, dan tidak dapat melibatkan Unity Editor (karena idealnya pengguna akhir akan dapat menentukan file data mereka sendiri).
Bagaimana saya bisa membuat GameObject baru, tanpa Unity secara otomatis instantiate untuk saya?
Misalnya, saya dapat melakukan panggilan seperti ini:
Resources.LoadAll("PrefabsDirectory", typeof(GameObject))
Dan saya akan mendapatkan daftar GameObjects, tidak ada yang ditambahkan ke adegan saat panggilan dilakukan. Pada dasarnya, saya membuat LoadAll
metode untuk prefab saya sendiri, dan juga, saya tidak ingin membuat instance GameObjects ketika panggilan dibuat.
sumber
Destroy
GameObject. Yang menghapusnya dari tempat kejadian dan melepaskannya, membuatnya tidak dapat digunakan.go.SetActive(false)
adalah cara terbaik untuk membuat sesuatu seperti kumpulan objek. Ini bukan yang Anda inginkan, tetapi mungkin Anda bisa memiliki sekelompok kecil objek tidak aktif yang kemudian dikloning untuk instantiasi khusus Anda.Jawaban:
Anda bisa mengubah hideFlags GameObject?
Saya baru saja mencoba menjalankan ini:
... dan itu ada di sana, tetapi tidak ada dalam hierarki. Secara teknis, itu ada di tempat kejadian, tetapi Anda tidak melihatnya sampai Anda mengubah bendera itu kembali ke HideFlags.None. Ini bukan jawaban yang Anda cari, tetapi setidaknya sejauh ini untuk pengembang, itu lebih bersih daripada mengelompokkan objek Anda.
sumber
Sayangnya, Anda tidak dapat melakukan hal itu dengan tepat. Namun, Anda dapat mencapai pola desain yang sama (mis. Abstrak jauh bangunan objek Anda, dan kemudian cukup memanggil mereka dengan satu perintah kemudian) melalui pola Pabrik .
Saat Anda menginginkan objek, panggil sesuatu seperti
Factory.CreateGameEntity()
, dan metode itu akan menangani semua yang ada di belakang layar.sumber
GetComponent<>() != null
. Dengan file data saya, parser harus mencari komponen yang benar dalam data. Sama untuk mendapatkan nilai dari dalam komponen, dan sebagainya. TheGameObject
kelas menyediakan banyak fungsi yang perlu digandakan oleh parser.Tidak ada cara untuk melakukannya
go = new GameObject();
tanpa menambahkannya ke tempat kejadian.Saya sedang mengerjakan RTS di mana basis pemain harus gigih, dan pada dasarnya, kami mengurutkan semua yang telah mereka lakukan dan memuatnya kembali pada waktu berjalan menggunakan aset yang dimodifikasi dari toko.
Sebagian besar output ke XML atau JSON sehingga cukup mudah untuk memuat file dan memanipulasi sesuai keinginan.
sumber
Cara yang benar adalah membuat prefab, Anda mengalokasikan prefab itu sebagai Obyek, lalu setiap kali Anda ingin instantiate cukup gunakan referensi Obyek ini dan melemparkannya sebagai GameObject.
mis:
sumber
Untuk memuat prefab ke dalam variabel sehingga Anda dapat instantiate nanti Anda akan menggunakan kode berikut:
Saya sudah melakukan ini dalam proyek dengan Unity 5.5. Ini akan tersedia untuk instantiate tetapi tidak dalam adegan atau bagian dari hierarki sampai instantiated seperti biasa.
sumber