Sumber daya tambahan budidaya
Resolusi dinamis

API documentation

CullingGroup menawarkan cara untuk mengintegrasikan sistem Anda sendiri ke pipa Unity dan LODTeknik Tingkat Detail (LOD) adalah optimasi yang mengurangi jumlah segitiga yang dimiliki Unity untuk membuat GameObject ketika jaraknya dari kamera meningkat. More info
Lihat di Glossary
. Ini dapat digunakan untuk banyak tujuan; misalnya:

  • Mensimulasikan kerumunan orang, sementara hanya memiliki GameObjectsObjek 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
    penuh untuk karakter yang sebenarnya terlihat sekarang
  • Membangun GPU particle systemKomponen yang mensimulasikan entitas fluida seperti cairan, awan dan nyala dengan menghasilkan dan memikat sejumlah besar gambar 2D kecil di tempat kejadian. More info
    Lihat di Glossary
    didorong oleh Grafik. DrawProcedural, tetapi sistem partikel rendering skipping yang berada di belakang dinding
  • Pelacakan yang memijat poin tersembunyi dari cameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
    Lihat di Glossary
    untuk memijat musuh tanpa pemain melihat mereka 'pop' ke dalam pandangan
  • Mengganti karakter dari animasi berkualitas penuh dan perhitungan AI ketika dekat, untuk perilaku lebih murah berkualitas rendah pada jarak
  • Memiliki 10.000 poin penanda dalam 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
    Anda dan secara efisien menemukan ketika pemain masuk dalam 1m dari salah satu dari mereka

API bekerja dengan memberikan array dari bidang yang terikat. Keterlihatan lingkup ini relatif terhadap kamera tertentu kemudian dihitung, bersama dengan nilai ‘banding’ yang dapat diperlakukan seperti nomor level LOD.

Memulai dengan CullingGroup

Tidak ada komponen atau alat visual untuk bekerja dengan CullingGroups; mereka dapat diakses secara murni melalui skrip.

Sebuah CullingGroup dapat dibangun menggunakan operator 'baru':

CullingGroup group = new CullingGroup();

Untuk memiliki CullingGroup melakukan perhitungan visibilitas, tentukan kamera yang harus digunakan:

group.targetCamera = Camera.main;

Membuat dan mengisi array dari struktur BoundingSphere dengan posisi dan radii dari bidang Anda, dan melewatinya ke SetBoundingSpheres bersama dengan jumlah bidang yang sebenarnya dalam array. Jumlah bidang tidak perlu sama dengan panjang array. Unity merekomendasikan bahwa Anda membuat array yang cukup besar untuk menahan sebagian besar bidang yang akan Anda miliki pada satu kali, bahkan jika jumlah awal bidang yang sebenarnya Anda miliki di array sangat rendah. Menggunakan array yang lebih besar memungkinkan Anda untuk menambahkan atau menghapus spheres sesuai kebutuhan tanpa proses yang mahal untuk mengubah array pada runtime.

BoundingSphere[] spheres = new BoundingSphere[1000];
spheres[0] = new BoundingSphere(Vector3.zero, 1f);
group.SetBoundingSpheres(spheres);
group.SetBoundingSphereCount(1);

Pada titik ini, CullingGroup akan mulai mengkomputasikan visibilitas satu bidang setiap bingkai.

Untuk membersihkan CullingGroup dan membebaskan semua memori yang digunakan, membuang CullingGroup melalui standar. Mekanisme IDisposable NET:

group.Dispose();
group = null;

Menerima hasil melalui callback onStateChanged

Cara yang paling efisien untuk menanggapi bidang mengubah visibilitas atau status jarak mereka adalah untuk menggunakan bidang callback onStateChanged. Mengatur ini ke fungsi yang mengambil struktur CullingGroupEvent sebagai argumen; kemudian akan disebut setelah penanaman selesai, untuk setiap bidang yang telah berubah keadaan. Anggota struktur CullingGroupEvent memberi tahu Anda tentang negara-negara sebelumnya dan baru di bidang.

group.onStateChanged = StateChangedMethod;

private void StateChangedMethod(CullingGroupEvent evt)
{
    if(evt.hasBecomeVisible)
        Debug.LogFormat("Sphere {0} has become visible!", evt.index);
    if(evt.hasBecomeInvisible)
        Debug.LogFormat("Sphere {0} has become invisible!", evt.index);
}

Menerima hasil melalui CullingGroup Query API

Selain delegate onStateChanged, CullingGroup menyediakan API untuk menghidupkan kembali visibilitas terbaru dan hasil jarak dari setiap bidang dalam array yang terikat. Untuk memeriksa keadaan satu bidang, gunakan metode IsVisible dan GetDistance:

bool sphereIsVisible = group.IsVisible(0);
int sphereDistanceBand = group.GetDistance(0);

Untuk memeriksa keadaan beberapa bidang, Anda dapat menggunakan metode QueryIndices. Metode ini memindai berbagai bidang terus menerus untuk menemukan salah satu yang cocok dengan keadaan visibilitas atau jarak tertentu.

// Allocate an array to hold the resulting sphere indices - the size of the array determines the maximum spheres checked per call
int[] resultIndices = new int[1000];
// Also set up an int for storing the actual number of results that have been placed into the array
int numResults = 0;

// Find all spheres that are visible
numResults = group.QueryIndices(true, resultIndices, 0);
// Find all spheres that are in distance band 1
numResults = group.QueryIndices(1, resultIndices, 0);
// Find all spheres that are hidden in distance band 2, skipping the first 100
numResults = group.QueryIndices(false, 2, resultIndices, 100);

Ingat bahwa informasi yang diambil oleh API query hanya diperbarui ketika kamera yang digunakan oleh Culling sebenarnyaGroup melakukan penanamannya.

CullingGroup API Praktik Terbaik

Ketika mempertimbangkan bagaimana Anda mungkin menerapkan CullingGroup ke proyek Anda, pertimbangkan aspek berikut dari desain CullingGroup.

Menggunakan visibilitas

Semua volume untuk visibilitas Calon CullingGroup didefinisikan oleh bidang yang terikat - dalam praktik, posisi (pusat sphere) dan nilai radius. Tidak ada bentuk yang terikat lainnya didukung, karena alasan kinerja. Dalam praktek ini berarti Anda akan mendefinisikan sebuah bidang yang sepenuhnya menutup objek yang Anda minati dalam penanaman. Jika fit yang lebih ketat diperlukan, pertimbangkan menggunakan beberapa bidang untuk menutupi bagian yang berbeda dari objek, dan membuat keputusan berdasarkan keadaan visibilitas dari semua bidang.

Untuk mengevaluasi visibilitas, CullingGroup perlu tahu jarak pandang kamera mana yang harus dipenuhi. Saat ini satu CullingGroup hanya mendukung satu kamera. Jika Anda perlu mengevaluasi visibilitas ke beberapa kamera, Anda harus menggunakan satu CullingGroup per kamera dan menggabungkan hasilnya.

CullingGroup akan menghitung visibilitas berdasarkan kusen frustum dan static occlusion cullingA yang menonaktifkan rendering objek ketika mereka tidak saat ini dilihat oleh kamera karena mereka dikabur (disebutkan) oleh benda lain. More info
Lihat di Glossary
hanya. Ini tidak akan mengambil objek dinamis ke dalam akun sebagai pemungut potensial.

Menggunakan jarak

CullingGroup mampu menghitung jarak antara beberapa titik referensi (misalnya, posisi kamera atau pemain) dan titik terdekat di setiap bidang. Nilai jarak ini tidak diberikan kepada Anda secara langsung, tetapi bukan dikuantisasi menggunakan serangkaian nilai ambang yang Anda berikan, untuk menghitung hasil integer ‘bandtance’ diskrit. Tujuannya adalah bahwa Anda menafsirkan band jarak ini sebagai ‘penampilan tertutup’, ‘penampilan menengah’, ‘penjualan jauh’, dan sebagainya.

CullingGroup akan memberikan callback ketika objek bergerak dari menjadi dalam satu band untuk berada di lain, memberi Anda kesempatan untuk melakukan hal-hal seperti mengubah perilaku objek itu ke sesuatu yang kurang intensif CPU.

Setiap bidang yang berada di luar band jarak terakhir akan dianggap tidak terlihat, memungkinkan Anda untuk dengan mudah membangun implementasi budidaya yang benar-benar menonaktifkan objek yang sangat jauh. Jika Anda tidak ingin perilaku ini, cukup set nilai ambang akhir Anda untuk berada di jarak tak terbatas.

Hanya satu titik referensi didukung per CullingGroup.

Kinerja dan desain

Sitemap API tidak memberi Anda kemampuan untuk membuat perubahan pada adegan Anda dan kemudian segera meminta keadaan visibilitas baru dari bidang yang terikat. Untuk alasan kinerja, CullingGroup hanya menghitung informasi visibilitas baru selama pelaksanaan penanaman untuk kamera secara keseluruhan; itu pada titik ini bahwa informasi tersedia untuk Anda, baik melalui callback, atau melalui CullingGroup query API. Dalam prakteknya, ini berarti Anda harus mendekati CullingGroup secara asinkron.

Array bidang yang terikat Anda berikan kepada CullingGroup direferensikan oleh CullingGroup, daripada disalin. Ini berarti Anda harus menyimpan referensi ke array yang Anda lewatkan ke SetBoundingSpheres, dan bahwa Anda dapat memodifikasi konten array ini tanpa perlu memanggil SetBoundingSpheres lagi. Jika Anda membutuhkan beberapa CullingGroups yang menghitung visibilitas dan jarak untuk set yang sama dari spheres - misalnya, untuk beberapa kamera - maka itu efisien untuk memiliki semua CullingGroups berbagi instance sphere yang sama.

Sumber daya tambahan budidaya
Resolusi dinamis