Catatan Upgrade Lainnya untuk Unity 5.0
Peningkatan ke Unity 3,5

Peningkatan ke Unity 4.0

Login Tujuan keadaan aktif

Unity 4.0 mengubah bagaimana keadaan aktif GameObjects ditangani. keadaan aktif GameObjectObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
sekarang diwariskan oleh anak GameObjects, sehingga setiap GameObject yang tidak aktif juga akan menyebabkan anaknya tidak aktif. Kami percaya bahwa perilaku baru lebih masuk akal daripada yang lama, dan harus selalu menjadi cara ini. Juga, sistem GUI baru mendatang sangat tergantung pada perilaku 4.0 baru, dan tidak akan mungkin tanpa itu. Sayangnya, ini mungkin memerlukan beberapa pekerjaan untuk memperbaiki proyek yang ada untuk bekerja dengan perilaku Unity 4.0 baru, dan ini adalah perubahan:

Perilaku lama:

  • Apakah GameObject aktif atau tidak didefinisikan oleh properti .active.
  • Ini bisa dikuasai dan diatur dengan memeriksa properti .active.
  • Negara aktif GameObject tidak berdampak pada keadaan aktif anak GameObjects. Jika Anda ingin mengaktifkan atau menonaktifkan GameObject dan semua anak-anaknya, Anda perlu memanggil GameObject.SetActiveRecursively.
  • Saat menggunakan SetActiveRecursively pada GameObject, keadaan aktif sebelumnya dari setiap anak GameObject akan hilang. Ketika Anda menonaktifkan dan kemudian mengaktifkan GameObject dan semua anak-anaknya menggunakan SetActiveRecursively, setiap anak yang tidak aktif sebelum panggilan ke SetActiveRecursively, akan menjadi aktif, dan Anda harus secara manual melacak keadaan aktif anak-anak jika Anda ingin mengembalikannya ke jalan itu.
  • Prefab tidak bisa mengandung keadaan aktif, dan selalu aktif setelah instansi prefabJenis aset yang memungkinkan Anda untuk menyimpan GameObject lengkap dengan komponen dan properti. Prefab bertindak sebagai template dari mana Anda dapat membuat instance objek baru di tempat kejadian. More info
    Lihat di Glossary
    .

Perilaku baru:

  • Apakah GameObject aktif atau tidak didefinisikan oleh properti .activeSelfnya sendiri, dan semua orang tuanya. GameObject aktif jika properti .activeSelf sendiri dan bahwa dari semua orang tuanya adalah true. Jika salah satu dari mereka adalah false, GameObject tidak aktif.
  • Ini dapat dikuasai menggunakan properti .activeInHierarchy.
  • Keadaan .activeSelf dari GameObject dapat diubah dengan memanggil GameObject.SetActive. Ketika memanggil SetActive (false) pada GameObject yang sebelumnya aktif, ini akan menonaktifkan GameObject dan semua anak-anaknya. Ketika memanggil SetActive (true) pada GameObject yang sebelumnya tidak aktif, ini akan mengaktifkan GameObject, jika semua orang tuanya aktif. Anak-anak akan diaktifkan ketika semua orang tua mereka aktif (yaitu, ketika semua orang tua mereka memiliki set .activeSelf untuk true).
  • Ini berarti bahwa SetActiveRecursively tidak lagi diperlukan, karena keadaan aktif diwariskan dari orang tua. Ini juga berarti bahwa, ketika menonaktifkan dan mengaktifkan bagian hirarki dengan memanggil SetActive, keadaan aktif sebelumnya dari setiap GameObject anak akan dipertahankan.
  • Prefab dapat mengandung keadaan aktif, yang diawetkan pada sekiasi prefab.

Contoh:

Anda memiliki tiga GameObjects, A, B dan C, sehingga B dan C adalah anak-anak A.

  • Sitemap C dengan memanggil C.SetActive(false).
  • A.activeInHierarchy == true, B.activeInHierarchy == true dan C.activeInHierarchy == false.
  • Sering, A.activeSelf == true, B.activeSelf == true dan C.activeSelf == false.
  • Sekarang kita menonaktifkan orang tua A dengan memanggil A.SetActive(false).
  • A.activeInHierarchy == false, B.activeInHierarchy == false dan C.activeInHierarchy == false.
  • Sering, A.activeSelf == false, B.activeSelf == true dan C.activeSelf == false.
  • Sekarang kita mengaktifkan orang tua A lagi dengan memanggil A.SetActive(true).
  • Sekarang, kita kembali ke A.activeInHierarchy == true, B.activeInHierarchy == true dan C.activeInHierarchy == false.
  • Sering, A.activeSelf == true, B.activeSelf == true dan C.activeSelf == false.

keadaan aktif baru di editor

Untuk memvisualisasikan perubahan ini, dalam editor Unity 4.0, setiap GameObject yang tidak aktif (baik karena properti .activeSelf sendiri diatur ke false, atau salah satu orang tua itu), akan diabukan di hirarki, dan memiliki ikon kelabu di inspectorJendela Unity yang menampilkan informasi tentang Pengaturan GameObject yang dipilih saat ini, aset atau proyek, memungkinkan Anda untuk memeriksa dan mengedit nilai. More info
Lihat di Glossary
. Properti .activeSelf GameObject sendiri tercermin oleh kotak centang aktif, yang dapat dialihkan terlepas dari keadaan induk (tetapi hanya akan mengaktifkan GameObject jika semua orang tua aktif).

Bagaimana hal ini mempengaruhi proyek yang ada:

  • Untuk membuat Anda menyadari tempat-tempat di kode Anda di mana ini mungkin mempengaruhi Anda, properti GameObject.active dan fungsi GameObject.SetActiveRecursively() telah diuraikan.
  • Mereka masih fungsional. Membaca nilai GameObject.active setara dengan membaca GameObject.activeInHierarchy, dan pengaturan GameObject.active setara dengan memanggil GameObject.SetActive(). Memanggil GameObject.SetActiveRecursively() setara dengan memanggil GameObject.SetActive() pada GameObject dan semua anak-anak itu.
  • Menunggu adegan dari 3,5 diimpor dengan mengatur properti selfActive dari setiap GameObject di sceneAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
    Lihat di Glossary
    untuk itu properti active sebelumnya.
  • Akibatnya, setiap proyek yang diimpor dari versi Unity sebelumnya masih harus bekerja seperti yang diharapkan (dengan peringatan kompiler, meskipun), selama itu tidak bergantung pada memiliki anak-anak aktif dari GameObjects tidak lagi mungkin dalam Unity 4.0).
  • Jika proyek Anda bergantung pada anak-anak aktif dari GameObjects tidak aktif, Anda perlu mengubah logika Anda ke model yang bekerja di Unity 4.0.

Perubahan pada pipa pemrosesan aset

Selama pengembangan 4.0 pipa impor aset kami telah berubah dalam beberapa cara yang signifikan internal untuk meningkatkan kinerja, penggunaan memori dan determinisme. Untuk sebagian besar perubahan ini tidak memiliki dampak pada pengguna dengan satu pengecualian: Objek dalam aset tidak dilakukan terus-menerus sampai akhir pipa impor dan versi aset yang sebelumnya diimpor akan benar-benar diganti.

Bagian pertama berarti bahwa selama pemrosesan pasca Anda tidak bisa mendapatkan referensi yang benar terhadap benda-benda dalam aset dan bagian kedua berarti bahwa jika Anda menggunakan referensi ke versi aset yang sebelumnya diimpor selama pemrosesan pasca modifikasi toko modifikasi modifikasi yang akan hilang.

Contoh referensi hilang karena mereka tidak tetap belum

Pertimbangkan contoh kecil ini:

public class ModelPostprocessor : AssetPostprocessor
{
    public void OnPostprocessModel(GameObject go)
    {
        PrefabUtility.CreatePrefab("Prefabs/" + go.name, go);
    }
}


Dalam Unity 3,5 ini akan membuat prefab dengan semua referensi yang benar ke jala dan sebagainya karena semua jala sudah telah dibuat tetap, tetapi karena ini bukan kasus di Unity 4.0 prosesor pos yang sama akan membuat prefab di mana semua referensi ke jala hilang, hanya karena Unity 4.0 belum tahu bagaimana menyelesaikan referensi untuk benda-benda di model asli prefab. Untuk benar menyalin modelprefab di untuk prefab Anda harus menggunakan OnPostProcessAllAssets untuk pergi melalui semua aset impor, menemukan modelprefab dan membuat prefab baru seperti di atas.

Contoh referensi untuk aset impor sebelumnya dibuang

Contoh kedua adalah sedikit lebih kompleks tetapi sebenarnya kasus penggunaan yang telah kita lihat dalam 3,5 yang rusak di 4.0. Berikut ini adalah ScriptableObject sederhana dengan referensi ke meshGrafik utama primitif Unity. Mesh membuat sebagian besar dunia 3D Anda. Unity mendukung mesh poligon triangulat atau Quadrangulasi. Nurbs, Nurms, permukaan Subdiv harus dikonversi ke poligon. More info
Lihat di Glossary
.

public class Referencer : ScriptableObject
{
    public Mesh myMesh; 
}


Kami menggunakan ScriptableObject ini untuk membuat aset dengan referensi ke jala dalam model, kemudian dalam prosesor posting kami kami mengambil referensi itu dan memberikan nama yang berbeda, hasil akhir yang ketika kami telah mengekspor kembali model nama mesh akan apa prosesor pos menentukan.

public class Postprocess : AssetPostprocessor
{
    public void OnPostprocessModel(GameObject go)
    {
        Referencer myRef = (Referencer)AssetDatabase.LoadAssetAtPath("Assets/MyRef.asset", typeof(Referencer));
        myRef.myMesh.name = "AwesomeMesh";
    }
}


Ini bekerja dengan baik di Unity 3,5 tetapi pada Unity 4.0 model yang sudah diimpor akan benar-benar diganti, sehingga mengubah nama mesh dari impor sebelumnya tidak akan berpengaruh. Solusi di sini adalah untuk menemukan jala dengan beberapa cara lain dan mengubah namanya. Apa yang paling penting untuk dicatat adalah bahwa dalam Unity 4.0 Anda harus HANYA memodifikasi input yang diberikan ke prosesor posting dan tidak bergantung pada versi yang sebelumnya diimpor dari aset yang sama.

Mesh Baca / Tulis pilihan

Unity 4.0 menambahkan opsi “Read/Write Enabled” di Pengaturan impor model. Ketika opsi ini dimatikan, ia menyimpan memori sejak Unity dapat membongkar salinan data mesh dalam permainan.

Namun, jika Anda menskalakan atau memutakhirkan jala pada runtime dengan skala non-uniform, Anda mungkin harus mengaktifkan “Read/Write Enabled” dalam pengaturan impor mereka. Alasannya adalah scaling non-uniform membutuhkan data mesh untuk disimpan dalam memori. Biasanya kami mendeteksi ini pada waktu build, tetapi ketika jala berskala atau dikelok-kelokkan pada runtime Anda perlu mengatur ini secara manual. Jika tidak mereka mungkin tidak diberikan dalam permainan membangun dengan benar.

Optimasi jala

Model Importer di Unity 4.0 telah menjadi lebih baik pada optimasi jala. The “Mesh Optimization” checkbox di Model Importer di Unity 4.0 sekarang diaktifkan secara default, dan akan memesan vertices di Mesh Anda untuk kinerja optimal. Anda mungkin memiliki beberapa kode atau efek post-processingProses yang meningkatkan visual produk dengan menerapkan filter dan efek sebelum gambar muncul di layar. Anda dapat menggunakan efek pasca proses untuk mensimulasikan kamera fisik dan sifat film, misalnya Bloom dan Kedalaman Lapangan. More info pemrosesan pos, pasca proses, pasca proses
Lihat di Glossary
dalam proyek Anda yang tergantung pada urutan simpul mesh Anda, dan ini mungkin rusak oleh perubahan ini. Dalam hal itu, matikan “Mesh Optimization” di importir Mesh. Terutama, jika Anda menggunakan komponen SkinnedCloth, optimasi mesh akan menyebabkan pemetaan berat simpul Anda untuk berubah. Jadi jika Anda menggunakan SkinnedCloth dalam proyek yang diimpor dari 3,5, Anda perlu mematikan “Mesh Optimization” untuk mesh yang terkena, atau mengkonfigurasi ulang berat simpul Anda untuk mencocokkan urutan simpul baru.

Mobil input

Dengan input sensor seluler Unity 4.0 mendapat keselarasan yang lebih baik antara platform, yang berarti Anda dapat menulis lebih sedikit kode saat menangani input khas pada platform seluler. Sekarang akselerasi dan input gyro akan mengikuti orientasi layar dengan cara yang sama baik di platform iOS dan Android. Untuk mengambil keuntungan dari perubahan ini Anda harus mengisi ulang kode input Anda dan menghapus platform dan orientasi layar kode spesifik ketika menangani percepatan dan input gyro. Anda masih bisa mendapatkan perilaku lama di iOS dengan mengatur Input.compensateSensors ke false.

Catatan Upgrade Lainnya untuk Unity 5.0
Peningkatan ke Unity 3,5