Alasan di balik desain engine Unity3D (objek game / komponen transformasi)

14

Saya mencoba memahami alasan di balik desain engine Unity3D dan ini adalah sesuatu yang belum dapat saya pikirkan: mengapa mengubah data yang disimpan dalam komponen terpisah, alih-alih menjadi bagian dari GameObject, seperti nama, layer mask dan tag? Itu tidak dapat dihapus seperti semua komponen lainnya, tidak ada alternatif dan karenanya tidak perlu dihapus.

snake5
sumber
Bagi saya ini kedengarannya seperti warisan arsitektur. Mungkin komponen transformasi ini dulunya merupakan komponen reguler, opsional, sehingga Anda dapat memiliki objek "keluar" dari ruang Cartesian. Kemudian beberapa kendala implementasi (optimasi?) Mengharuskan komponen ini selalu ada, dan tetap seperti ini. Tapi itu hanya anggapan, akan dibutuhkan seorang insinyur dari Unity untuk menjawab pertanyaan itu secara nyata.
Laurent Couvidou

Jawaban:

11

Hanya pengembang Unity yang dapat memberikan motivasi mereka yang sebenarnya untuk desain ini, tetapi satu argumen yang mendukung melakukannya dengan cara ini adalah bahwa ada argumen bahwa setiap kelas dalam proyek perangkat lunak harus menangani satu dan hanya satu tanggung jawab . GameObject adalah kumpulan bernama Components, dan menambahkan posisi / rotasi / dll untuk itu berarti ia akan memiliki 2 tanggung jawab. Komponen Transform menangani posisi dan rotasi dan oleh karena itu tidak boleh juga bertanggung jawab untuk memberi nama atau menggabungkan komponen lain (yang mungkin tidak terkait). Jadi masuk akal jika 2 konsep ini ada dalam 2 objek terpisah.

Secara lebih umum, pertanyaan ini menanyakan "jika ada hubungan 1 banding 1 antara X dan Y, mengapa Y bukan bagian dari X atau sebaliknya?" Dan jawaban umumnya adalah bahwa perangkat lunak lebih mudah untuk dikembangkan dan dipelihara ketika dipecah menjadi bagian-bagian mandiri yang lebih kecil, bahkan jika 2 bagian selalu bekerja bersama bersamaan.

Kylotan
sumber
Saya juga mempertimbangkan hal itu tetapi mereka dapat memindahkan pemfilteran GameObject (lapisan, tag) ke komponen terpisah karena alasan yang sama - namun mereka tidak melakukannya. Selanjutnya, komponen transformasi terikat terlalu dalam di sistem dengan memegang data hierarki (orang tua, anak-anak dll).
snake5
1
Dapat dikatakan bahwa lapisan dan tag adalah bentuk penamaan, harus hidup berdampingan dengan nama, dan juga merupakan bagian intrinsik dari apa yang merupakan kumpulan komponen dalam sistem. Adapun transformasi memegang pengasuhan, Anda ada benarnya, tetapi tidak ada yang mengklaim sistem Unity sempurna. Jika itu sistem saya, saya akan membuat Transforms terpisah, dan memindahkan orang tua / anak-anak ke GameObject.
Kylotan
1

Transform adalah komponen wajib di Unity.

Alasan mengapa transformasi adalah komponen wajib adalah bahwa objek permainan terletak dalam sebuah adegan dan karenanya memerlukan informasi spasial (posisi, orientasi dan skala) tentang objek itu. (Informasi ini tidak selalu digunakan, tetapi menjaga komponen transformasi wajib membuat hal-hal sedikit lebih sederhana).

Mortennobel
sumber
1
Pertanyaannya bukan tentang desain berbasis komponen apa. Ini tentang mengapa "mengubah" bukan komponen juga
bummzack
1
Tetapi Transform adalah komponen dalam Unity! docs.unity3d.com/Documentation/ScriptReference/Transform.html . Satu-satunya hal yang aneh tentang transformasi adalah bahwa itu adalah Komponen wajib untuk GameObject.
Mortennobel
Ya saya kira pertanyaannya adalah mengapa Anda tidak bisa menghapusnya? OP tidak akan menandai pertanyaannya "berbasis komponen" jika dia tidak terbiasa dengan istilah itu.
bummzack
Anda benar - terima kasih. Saya telah memperbarui jawabannya untuk menjawab pertanyaan dengan lebih baik.
Mortennobel
3
Pertanyaannya adalah tentang mengapa mengubah data adalah komponen yang terpisah (berbeda dengan data biasa di dalam GameObject seperti nama, layer mask, tag). Saya mencoba membuatnya lebih jelas dalam revisi terbaru dari posting saya.
snake5
0

Ini TransformComponentadalah yang paling sulit Componentuntuk dirancang dengan baik dalam arsitektur video game. Hampir setiap orang Componentperlu mengetahui tentang GameObjectposisi, rotasi, atau skala yang diberikan, jadi memisahkan dengan benar semua sistem yang saling terkait ini pada dasarnya sulit.

Akan selalu ada pengorbanan dalam arsitektur. Dengan TransformComponentmenjadi statis (yaitu tidak dinamis), pengembang di Unity dapat menulis kode dengan asumsi ini. Saya akan menganggap ini membuat segalanya lebih mudah di pihak mereka tanpa menambah banyak ketidaknyamanan di pihak kami. Hal ini mirip dengan paradigma berorientasi objek, di mana GameObjectakan extendbeberapa abstract class, Transformable.

Alex
sumber