Apakah C # berbeda dalam Unity?


18

Apakah Unity menggunakan versi C # yang berbeda, atau apakah semuanya sama? Ini terlihat berbeda dari C # biasa tetapi ada beberapa elemen C # biasa di sana.


4
Apa perbedaan yang kamu lihat?
Anko

Saya menduga perubahan yang Anda maksudkan adalah perbedaan kerangka kerja dan bukan bahasa C #. Di Unity3d Anda menggunakan .Net framework (Via Mono) dan elemen kerangka kerja khusus Unity dengan bahasa C #.
Mike B

Itu hanya versi yang sangat lama. Jika Anda menginginkan versi terbaru dari C # dan Mono dan ingin memprogram daripada membuat skrip mesin yang dibuat sebelumnya, maka pertimbangkan sesuatu seperti monogame.net
Den

Saya perhatikan sedikit perbedaan perpustakaan, misalnya di Unity ada kelas Mathf untuk fungsi matematika, bukan kelas Math. Saya belum memperhatikan jika ada perbedaan lain, tapi itu yang menonjol.
Alex

@Alex System.Math masih tersedia, dan ternyata sebenarnya lebih cepat dari UnityEngine.Mathf . Jadi satu-satunya alasan nyata untuk menggunakan versi Unity adalah untuk menghindari banyak gips (float) .. dengan mengorbankan beberapa kinerja.
FlintZA

Jawaban:


9

Seperti yang dinyatakan dalam jawaban lain, Unity 4.x menggunakan versi Mono yang dimodifikasi berdasarkan Mono 2.6

Sebagian besar, ini kompatibel dengan .Net 2.0 , meskipun saya belum berhasil melacak daftar kompatibilitas spesifik Mono 2.6.

Ini terlihat berbeda dari C # biasa tetapi ada beberapa elemen C # biasa di sana.

Seperti yang disebutkan dalam salah satu komentar pada pertanyaan Anda, ini kemungkinan disebabkan oleh API scripting khusus Unity daripada bahasa itu sendiri.

Sebagai contoh, banyak kode dalam proyek Unity yang khas terkandung dalam subkelas dari kelas yang disebut MonoBehavior. Ini adalah komponen yang dijatuhkan di GameObjects dalam lingkungan Unity Editor. Arsitektur ini mengarah ke kode C # yang terlihat berbeda dengan kode C # khas (bagi saya) dalam beberapa cara:

  • Sampai Unity 4 dirilis, objek-objek ini tidak dapat terkandung dalam ruang nama, jadi mereka selalu ada dalam ruang nama global
  • Mereka mengekspos bidang ke lingkungan editor dengan menjadikannya publik (atau dengan menggunakan atribut SerializeField, tapi saya menemukan sangat sedikit orang yang menggunakan ini), yang mengarah ke sejumlah besar bidang publik di kelas
  • Privasi dan konvensi kasus Unity tidak mengikuti Microsoft, jadi ini juga dapat terlihat aneh bagi pengembang C # "tradisional"
  • Mereka menggunakan sejumlah metode khusus pada komponen-komponen ini, seperti Mulai dan Pembaruan, yang tidak menggantikan seperti yang biasanya diharapkan, tetapi diakses dengan cara refleksi.

Secara praktis, fitur bahasa C # terbesar yang saya lewatkan dalam versi C # Unity saat ini adalah dukungan untuk async dan kata kunci serta fungsionalitas terkait. Konsep serupa di Unity adalah coroutine . Ini dijalankan pada utas utama sehingga async tidak benar, tetapi memungkinkan kode berjalan lama untuk dipecah menjadi beberapa frame. Multithreading tingkat rendah masih didukung.


2
Hanya untuk memperjelas, asyncdi C # juga tidak benar async seperti di multi-threaded - itu juga berjalan di utas utama. Perbedaan terbesar, dari perspektif penggunaan, antara coroutine dan async adalah waktu kode dijalankan.
rhughes

Terima kasih. Ya async! = Multithreaded, meskipun saya akan mengatakan jauh lebih umum menggunakan async untuk bersembunyi / berinteraksi dengan operasi multithread daripada melakukan hal yang sama dengan coroutine. Saya telah menulis coroutine pembungkus yang memulai tugas delegasi pada threadpool yang membuat saya memiliki tingkat fleksibilitas yang sangat mirip, tetapi saya masih tidak keberatan memiliki dukungan async yang "tepat". Tentu saja GC modern yang layak akan lebih baik;)
FlintZA

21

Unity 4 menggunakan Mono 2.6 , yang merupakan implementasi penuh dari kerangka .NET, termasuk bahasa C #.

Saya tidak yakin tampilannya berbeda, tetapi perlu diingat bahwa Unity mendukung beberapa bahasa, yang semuanya berfungsi di atas runtime Mono yang sama. Mungkinkah Anda membingungkan C # dengan UnityScript ?


10
Untuk menambahkan, Mono 2.6 setara dengan C # 3.0 dalam hal fitur bahasa. Mono 2.6.1 mulai menambahkan fitur C # 4.0.
Cooper

Berikut ini adalah ikhtisar yang bagus tentang Kompatibilitas Mono Unity pada v4.1.2
Kelly Thomas

Ini tidak hanya tertinggal kecil tetapi juga peningkatan versi utama: mono-project.com/Release_Notes_Mono_3.4
Den

3

Persatuan menggunakan C # biasa.

Kemudian lagi, ketika Anda menulis C # di Unity Anda akan menggunakan banyak pustaka mereka, tetapi sejauh yang saya tahu, segala sesuatu yang mungkin dalam C # adalah mungkin di Unity, selain perbedaan yang tercantum di bawah ini:

  • Area yang lebih spesifik. Net yang terkait dengan Windows Forms & ASP terlarang melalui Unity.

  • Meskipun Anda dapat menggunakan Visual Studio untuk mengedit dan mengkompilasi kesalahan waktu, Anda harus membangun dan menjalankan di Unity IDE.

  • Unity menggunakan Mono yang merupakan implementasi open source dari .Net yang berarti ada sedikit perbedaan.


Untuk memperluas peluru kedua Anda - Anda juga dapat men-debug dalam Visual Studio dengan menggunakan UnityVS . Microsoft baru-baru ini mengakuisisi pengembang sehingga mereka akan merilis plugin secara gratis dalam waktu dekat.
mrohlf

Maaf tetapi tidak ada di dekat C # biasa.
Alper

0

Pertanyaan apakah Versi C # yang digunakan oleh Unity berbeda dari "biasa" C # telah dijawab oleh posting lain. Karena Anda secara eksplisit meminta elemen-elemen tertentu yang mungkin berbeda dari versi reguler seperti itu, saya akan membagikan satu-satunya perbedaan kecil yang saya perhatikan ketika membandingkan C # yang saya gunakan di tempat kerja (yaitu C # 4.0 di Visual Studio 2010 dan lebih tinggi) dan C # di Unity, yang adalah bahwa saya tidak dapat menggunakan nilai default untuk parameter dalam definisi fungsi. yaitu Anda harus mengatur proyek Anda lebih hati-hati untuk menggunakan versi C # yang lebih baru. Lihat tautan ini untuk penjelasan lebih lanjut.

Sunting: Saya meninggalkan jawaban ini karena sejauh yang saya tahu ini adalah kesalahpahaman yang terjadi pada banyak orang.


Karena fitur itu hanya ditambahkan ke C # dalam versi 4.0 dan tidak ada sebelumnya, ketidakhadirannya tidak dapat benar-benar disebut "perbedaan" menjadi "C #".
ATAU Mapper

1
C # Versi 4 dirilis pada 2010. Saya pikir banyak orang menggunakannya dan merasa, seperti saya, ketidakhadirannya saat pemrograman di Unity.
Nessuno

Apakah Anda yakin tidak dapat menggunakan nilai default? Saya cukup yakin saya lakukan dan memiliki ...
NPSF3000

Yah saya mencoba dan itu tidak akan dikompilasi dengan pesan yang mengatakan bahwa saya tidak dapat menggunakan nilai default. Apakah Anda menggunakan versi khusus Unity? Suka versi pro?
Nessuno

1
Anda benar-benar dapat menggunakan nilai default, dan itu tidak ada hubungannya dengan pro atau tidak-pro. Unity dan MonoDevelop memiliki hubungan yang aneh. Proyek yang dibuat secara otomatis di MonoDevelop sering disetel ke versi C # sebelumnya yang tidak mendukung nilai default. Namun jika Anda mengubah pengaturan itu dalam proyek, itu akan berfungsi dengan baik. Jika Anda mengabaikan kompilasi di MonoDevelop, dan kembali saja ke Unity, Anda akan perhatikan bahwa Unity tidak mengeluh tentang parameter default.
MrCranky
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.