Perpustakaan untuk mengizinkan skrip menulis Unity dalam kode asli: C, C ++, perakitan.
Proyek ini bertujuan untuk memberi Anda alternatif yang layak untuk C#. Scripting di C ++ tidak tepat untuk semua bagian dari setiap proyek, tetapi sekarang ini adalah pilihan.
Mengubah satu baris kode C# mengharuskan Anda membuat bangunan baru dari permainan. Waktu build Android yang khas cenderung setidaknya 10 menit karena IL2CPP harus berjalan dan kemudian sejumlah besar C ++ harus dikompilasi.
Dengan menggunakan C ++, kami dapat mengkompilasi game sebagai plugin C ++ dalam waktu sekitar 1 detik, menukar plugin ke APK, dan kemudian segera menginstal dan menjalankan game. Itu dorongan produktivitas yang sangat besar!
C ++ mengkompilasi jauh lebih cepat daripada C#. Incremental Builds Ketika hanya satu file berubah- build yang paling umum- bisa 15x lebih cepat daripada dengan C#. Kompilasi yang lebih cepat bertambah dari waktu ke waktu untuk keuntungan produktivitas. Waktu iterasi yang lebih cepat membuatnya lebih mudah untuk tetap dalam "aliran" pemrograman.
Kolektor sampah Unity adalah wajib dan memiliki banyak masalah. Ini lambat, berjalan di utas utama, mengumpulkan semua sampah sekaligus, fragmen tumpukan, dan tidak pernah menyusut tumpukan. Jadi permainan Anda akan mengalami "bingkai hitches" dan akhirnya Anda akan kehabisan memori dan crash.
Sejumlah besar upaya diperlukan untuk bekerja di sekitar GC dan kode yang dihasilkan sulit dipelihara dan memperlambat. Ini termasuk teknik seperti kumpulan objek, yang pada dasarnya membuat manual manajemen memori. Anda juga harus menghindari jenis nilai tinju seperti int ke tipe yang dikelola seperti object , tidak menggunakan loop foreach dalam beberapa situasi, dan berbagai gotcha lainnya.
C ++ tidak memiliki pengumpul sampah yang diperlukan dan fitur manajemen memori otomatis opsional melalui tipe "pointer pintar" seperti shared_ptr. Ini menawarkan alternatif yang sangat baik untuk pengumpul sampah primitif Unity.
Saat menggunakan beberapa API .NET masih akan melibatkan pembuatan sampah, masalahnya hanya terkandung untuk API tersebut daripada menjadi masalah yang meresap untuk semua kode Anda.
Dengan menggunakan C ++ secara langsung, Anda mendapatkan kontrol penuh atas kode yang akan dijalankan CPU. Jauh lebih mudah untuk menghasilkan kode optimal dengan kompiler C ++ daripada dengan kompiler C#, IL2CPP, dan akhirnya kompiler C ++. Potong perantara dan Anda dapat memanfaatkan intrinsik atau perakitan kompiler untuk langsung menulis kode mesin menggunakan fitur CPU yang kuat seperti enkripsi AES SIMD dan perangkat keras untuk keuntungan kinerja besar-besaran.
C ++ adalah bahasa yang jauh lebih besar daripada C# dan beberapa pengembang akan lebih suka memiliki lebih banyak alat yang mereka miliki. Berikut beberapa perbedaan:
Sementara IL2CPP mengubah C# menjadi C ++, itu menghasilkan banyak overhead. Ada banyak kejutan jika Anda membaca C ++ yang dihasilkan. Misalnya, ada overhead untuk fungsi apa pun menggunakan variabel statis dan dua pointer tambahan disimpan di awal setiap kelas. Hal yang sama berlaku untuk semua jenis fitur seperti sizeof() , pemeriksaan nol wajib, dan sebagainya. Sebaliknya, Anda dapat menulis C ++ secara langsung dan tidak perlu bekerja di sekitar IL2CPP.
C ++ adalah bahasa standar untuk video game serta banyak bidang lainnya. Dengan pemrograman di C ++ Anda dapat lebih mudah mentransfer keterampilan dan kode Anda ke dan dari proyek non-unitas. Misalnya, Anda dapat menghindari penguncian dengan menggunakan bahasa yang sama (C ++) yang akan Anda gunakan di mesin Unreal atau Lumberyard.
GameObject go;
Transform transform = go.GetTransform();
Vector3 position(1.0f, 2.0f, 3.0f);
transform.SetPosition(position);
MonoBehaviour di C ++ void MyScript::Start()
{
String message("MyScript has started");
Debug::Log(message);
}
#if TARGET_OS_ANDROID )Inti dari proyek ini adalah generator kode. Ini menghasilkan kode C# dan C ++ yang disebut "Bindings" yang membuat C# API tersedia untuk kode game C ++. Ini mendukung berbagai fitur bahasa:
classstructenumAction )decimalget dan set seperti obj.x )get dan set seperti obj[x] )add and remove delegates)int ke object dan visa versa)out dan refPerhatikan bahwa generator kode belum mendukung:
Array , string , dan object (misalnya GetHashCode )params implisit (alias "var args") lewat Untuk mengonfigurasi generator kode, buka Unity/Assets/NativeScriptTypes.json dan perhatikan contoh yang ada. Tambahkan ke file ini untuk mengekspos lebih banyak C# API dari Unity, .net, atau DLL khusus ke kode C ++ Anda.
Untuk menjalankan generator kode, pilih NativeScript > Generate Bindings dari Unity Editor.
Hampir semua proyek akan melihat kemenangan kinerja bersih dengan mengurangi pengumpulan sampah, menghilangkan overhead IL2CPP, dan akses ke kompiler intrinsik dan perakitan. Panggilan dari C ++ ke C# hanya mengeluarkan penalti kinerja kecil. Dalam kasus yang jarang bahwa hampir semua kode Anda adalah panggilan ke .NET API maka Anda mungkin mengalami kehilangan kinerja bersih.
Artikel Pengujian dan Benchmarks
Artikel Optimalisasi
Saat skrip dalam C ++, C# hanya digunakan sebagai lapisan "mengikat" sehingga Unity dapat memanggil fungsi C ++ dan fungsi C ++ dapat memanggil API Unity. Generator kode digunakan untuk menghasilkan sebagian besar binding ini sesuai dengan kebutuhan proyek Anda.
Semua kode Anda, ditambah beberapa binding, akan ada di plugin "asli" C ++ tunggal. Saat Anda mengubah kode C ++ Anda, Anda akan membangun plugin ini dan kemudian memutar game di editor atau di build yang digunakan (misalnya ke perangkat Android). Tidak akan ada kode C# untuk Unity untuk dikompilasi kecuali Anda menjalankan generator kode, yang jarang terjadi.
Alur kerja C# standar terlihat seperti ini:
Dengan C ++, alur kerja terlihat seperti ini:
Unity/Assets ke Direktori Assets Proyek Persatuan AndaNativeScriptTypes.json dan tentukan bagian mana dari Unity, .net, dan API DLL khusus yang ingin Anda akses dari C ++.Unity/Assets/CppSource/Game/Game.cpp dan Unity/Assets/CppSource/Game/Game.h untuk membuat game Anda. Beberapa contoh kode disediakan, tetapi jangan ragu untuk menghapusnya. Anda dapat menambahkan lebih banyak file C ++ Source ( .cpp ) dan header ( .h ) di sini saat game Anda tumbuh./Applications/Utilitiescd /path/to/your/build/directorycmake -G MyGenerator -DCMAKE_TOOLCHAIN_FILE=/path/to/your/project/CppSource/iOS.cmake /path/to/your/project/CppSource . Ganti MyGenerator dengan generator pilihan Anda. Untuk melihat opsi, jalankan cmake --help dan lihat daftar di bagian bawah. Pilihan umum termasuk "unix makefiles" untuk membangun dari baris perintah atau "xcode" untuk menggunakan IDE Apple.make jika Anda memilih Unix Makefiles sebagai generator atau buka NativeScript.xcodeproj dan klik Product > Build jika Anda memilih XCODE. /Applications/Utilitiescd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . Ganti MyGenerator dengan generator pilihan Anda. Untuk melihat opsi, jalankan cmake --help dan lihat daftar di bagian bawah. Pilihan umum termasuk "unix makefiles" untuk membangun dari baris perintah atau "xcode" untuk menggunakan IDE Apple. Hapus -DEDITOR=TRUE untuk build mandiri.make if you chose Unix Makefiles as your generator or open NativeScript.xcodeproj and click Product > Build if you chose Xcode. cd /path/to/your/build/directorycmake -G "Visual Studio VERSION YEAR Win64" -DEDITOR=TRUE /path/to/your/project/CppSource . Ganti VERSION dan YEAR dengan versi Visual Studio yang ingin Anda gunakan. Untuk melihat opsi, jalankan cmake --help dan lihat daftar di bagian bawah. Misalnya, gunakan "Visual Studio 15 2017 Win64" untuk Visual Studio 2017. Versi apa pun, termasuk komunitas, berfungsi dengan baik. Hapus -DEDITOR=TRUE untuk build mandiri. Jika Anda menggunakan Visual Studio 2019, jalankan cmake -G "Visual Studio 16" -A "x64" -DEDITOR=TRUE /path/to/your/project/CppSource sebagai gantinya.NativeScript.sln dan klik Build > Build Solution . cd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . Ganti MyGenerator dengan generator pilihan Anda. Untuk melihat opsi, jalankan cmake --help dan lihat daftar di bagian bawah. Pilihan yang paling umum adalah "unix makefiles" untuk dibangun dari baris perintah, tetapi ada juga opsi IDE. Hapus -DEDITOR=TRUE untuk build mandiri.make jika Anda memilih Unix Makefiles sebagai generator Anda. cd /path/to/your/build/directorycmake -G MyGenerator -DANDROID_NDK=/path/to/android/ndk /path/to/your/project/CppSource . Ganti MyGenerator dengan generator pilihan Anda. Untuk melihat opsi, jalankan cmake --help dan lihat daftar di bagian bawah. Untuk membuat build untuk platform apa pun selain Android, keluarkan -DANDROID_NDK=/path/to/android/ndk bagian.make jika Anda memilih Unix Makefiles sebagai generator Anda. Untuk memperbarui ke versi baru dari proyek ini, menimpa direktori Assets/NativeScript proyek Unity Anda dengan direktori Unity/Assets/NativeScript proyek ini dan menjalankan kembali generator kode.
Artikel oleh penulis yang menjelaskan pengembangan proyek ini.
Jackson Dunstan
Jangan ragu untuk membayar dan mengirim permintaan tarik atau hanya mengirimkan masalah untuk fitur atau perbaikan bug.
Semua kode adalah MIT berlisensi, yang berarti biasanya dapat dengan mudah digunakan dalam aplikasi komersial dan non-komersial.
Semua tulisan dilisensikan CC oleh 4.0, yang berarti dapat digunakan selama atribusi diberikan.