Bagaimana cara membuat GameObject baru, tanpa menambahkannya ke tempat kejadian?


10

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 LoadAllmetode untuk prefab saya sendiri, dan juga, saya tidak ingin membuat instance GameObjects ketika panggilan dibuat.


1
Aku khawatir kamu tidak bisa. Saya pikir Anda harus menunda instantiasi kelas Anda.
Roberto

Sudah lama sejak saya menyentuh Unity, tetapi jika ternyata tidak ada jalan keluar, bisakah Anda menghapus objek dari adegan segera setelah dan memiliki hasil yang diinginkan, hanya sedikit tidak efisien?
Kevin Reid

@KevinReid Saya percaya satu-satunya cara untuk melakukan itu adalah memanggil DestroyGameObject. Yang menghapusnya dari tempat kejadian dan melepaskannya, membuatnya tidak dapat digunakan.
MichaelHouse

1
@ Pandaanda punya ide bagus. Memanggil 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.
AndrewEkeren

1
@ Byte56: Mengapa tepatnya Anda ingin melakukan pra-instantiasi prefab khusus Anda dan tidak hanya membuat GO dengan komponen-komponen yang diperlukan saat itu juga sambil membuat instantiasinya menggunakan pola seperti pabrik? Untuk apa yang saya pahami, Anda ingin mengizinkan pengguna untuk "membuat serial" prefab menggunakan "file data mereka sendiri", jadi Anda harus tetap membaca file-file tersebut pada saat run time dan membuat komponen yang diperlukan .. apakah saya kehilangan sesuatu?
Heisenbug

Jawaban:


6

Anda bisa mengubah hideFlags GameObject?

Saya baru saja mencoba menjalankan ini:

GameObject myGameObject = new GameObject ();
myGameObject.name = "Obvious Name";

myGameObject.hideFlags = HideFlags.HideInHierarchy;

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


1
Ini, dipasangkan dengan menonaktifkannya (sehingga tidak ada skrip mengeksekusi), bisa bekerja. Saya akan mencobanya dan memberi tahu Anda. Ini masih bekerja di sekitar, tetapi saya pikir itulah yang tersisa dengan saya pada saat ini. Dan, sejauh yang kita tahu, ini bisa menjadi apa yang dilakukan secara internal, meskipun saya ragu.
MichaelHouse

1
@ Byte56: Saya pikir itu juga merupakan solusi, tetapi saya benar-benar menemukan hari ini bahwa Unity melakukan hal yang persis sama ketika mempratinjau animasi: itu instantiate objek game tersembunyi dalam adegan dan membuat mereka ke bingkai pratinjau dengan kamera khusus. Jadi mungkin tidak terdengar bersih, tetapi sebenarnya solusi ini tampaknya digunakan juga secara internal.
Heisenbug

1
Maaf untuk menerima terlambat. Saya baru saja mengimplementasikan ini dan itu bekerja dengan baik. Terima kasih.
MichaelHouse

0

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.


Ini lebih kompleks daripada yang mungkin Anda pikirkan, membuatnya tidak sebersih itu. Saya akan memposting jawaban akan detail lengkap, tetapi pada dasarnya parser harus cukup kompleks. Misalnya, jika saya ingin menguji apakah prefab memiliki komponen, sebelum instantiating, sesederhana itu GetComponent<>() != null. Dengan file data saya, parser harus mencari komponen yang benar dalam data. Sama untuk mendapatkan nilai dari dalam komponen, dan sebagainya. The GameObjectkelas menyediakan banyak fungsi yang perlu digandakan oleh parser.
MichaelHouse

Jika Anda dapat memberikan bukti atau bahkan alasan mengapa ini tidak bisa dilakukan, itu akan membuat jawaban ini lengkap.
MichaelHouse

Saya akan lihat nanti apakah saya bisa menemukan dokumentasi yang pasti tentang hal ini, untuk saat ini semua saya dapat menemukan adalah forum benang ini forum.unity3d.com/threads/... - answers.unity3d.com/questions/366273/... - answers.unity3d .com / pertanyaan /
19736

0

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.


Terima kasih, Marc. Bisakah Anda memberikan bukti atau alasan untuk tidak bisa membuat GameObject baru tanpa menambahkannya ke tempat kejadian? Saya memiliki kode serialisasi sendiri, jadi itu bukan masalah, terima kasih atas sarannya.
MichaelHouse

-1

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:

private Object prefab;


public static GameObject Create(void)
{
   return (Instantiate(prefab , position , rotation) as GameObject);
}

1
Itu menggunakan sistem cetakan yang ada. Seperti yang dinyatakan oleh pertanyaan saya, saya pada dasarnya membuat sistem cetakan saya sendiri. Bagian dari persyaratan adalah "tidak dapat melibatkan Editor Persatuan". Membuat prefab menggunakan Unity Editor.
MichaelHouse

Yang tidak bisa Anda lakukan, Anda akan memerlukan lisensi untuk pengembang menggunakan SDK mereka untuk kemudian dapat membuat data Anda sendiri. Kecuali saya salah, mereka tidak akan membagikan kode mereka tanpa bling bling. Tapi saya tahu beberapa orang dapat mengekspor adegan dari Unity ke mesin game mereka sendiri
Ericool

Yah, itu jelas mungkin karena saya memang membuat sistem cetakan saya sendiri menggunakan jawaban yang dipilih. Anda dapat mempelajari cara melakukannya dalam kursus yang saya buat, ditemukan di profil saya.
MichaelHouse

tidak, terima kasih. Saya seorang programmer game yang sudah lulus :) Nah, jika Anda berhasil, Anda tidak perlu membuat game
Ericool

Ini adalah sistem yang pada dasarnya memungkinkan pengguna akhir untuk membuat cetakan. Ini cukup berguna dalam gim untuk mod dan konten buatan pengguna akhir lainnya. (Jadi ya, saya pikir ini cukup berguna dalam membuat game).
MichaelHouse

-1

Untuk memuat prefab ke dalam variabel sehingga Anda dapat instantiate nanti Anda akan menggunakan kode berikut:

 GameObject ball = (GameObject)(Resources.Load ("myPrefab"));

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.


Saya merasa Anda salah membaca pertanyaan. Jawaban ini melibatkan penggunaan sistem cetakan awal . Pertanyaan ini diajukan dalam konteks menciptakan sistem cetakan kustom , di mana ini tidak dapat diakses. Contoh di bagian bawah berfungsi untuk menyoroti hal ini lebih lanjut.
Gnemlock

"Bagaimana saya bisa membuat GameObject baru, tanpa Unity secara otomatis instantiate untuk saya?" Apakah pertanyaan itu ditanyakan dan kode ini menjawabnya. Kode dapat diubah untuk mendapatkan hasil yang diinginkan dengan sistem pemuatan kustom.
darthhawk

Ini pada dasarnya apa yang saya jelaskan dalam contoh yang termasuk dalam pertanyaan. Dan itu berfungsi dengan baik untuk cetakan, tetapi tidak untuk membuat objek game baru dari file data.
MichaelHouse
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.